ckeditor/plugins/crossreference/dialogs/crossreference-link.js
author indvd00m (gotoindvdum[at]gmail[dot]com)
Thu, 15 Dec 2016 18:10:20 +0300
changeset 0 44d330dccc59
child 5 c925ae656709
permissions -rw-r--r--
Init sample
indvd00m@0
     1
CKEDITOR.dialog.add('crossreference-link-dialog', function(editor) {
indvd00m@0
     2
	
indvd00m@0
     3
	var config = editor.config.crossreference;
indvd00m@0
     4
	
indvd00m@0
     5
	var updateAnchors = function(dialog) {
indvd00m@0
     6
		dialog.setState(CKEDITOR.DIALOG_STATE_BUSY);
indvd00m@0
     7
		
indvd00m@0
     8
		dialog.anchors = [];
indvd00m@0
     9
		dialog.anchorsByGuid = {};
indvd00m@0
    10
		dialog.anchorsGroupNameByGuid = {};
indvd00m@0
    11
		
indvd00m@0
    12
		var type = null;
indvd00m@0
    13
		var typeName = dialog.getValueOf('tab-main', 'type');
indvd00m@0
    14
		if (typeName)
indvd00m@0
    15
			type = config.types[typeName];
indvd00m@0
    16
		
indvd00m@0
    17
		dialog.setValueOf('tab-main', 'filter', '');
indvd00m@0
    18
		
indvd00m@0
    19
		var anchorSelect = dialog.getContentElement('tab-main', 'anchor');
indvd00m@0
    20
		anchorSelect.clear();
indvd00m@0
    21
		anchorSelect.add('', '');
indvd00m@0
    22
		
indvd00m@0
    23
		var anchorGroupSelect = dialog.getContentElement('tab-main', 'anchorGroup');
indvd00m@0
    24
		anchorGroupSelect.clear();
indvd00m@0
    25
		anchorGroupSelect.add('', '');
indvd00m@0
    26
		if (type && type.groupAnchors == true)
indvd00m@0
    27
			anchorGroupSelect.getElement().show();
indvd00m@0
    28
		else
indvd00m@0
    29
			anchorGroupSelect.getElement().hide();
indvd00m@0
    30
		
indvd00m@0
    31
		config.findAnchors(config, editor, type, function(anchors) {
indvd00m@0
    32
			dialog.anchors = anchors;
indvd00m@0
    33
			dialog.anchorsByGuid = {};
indvd00m@0
    34
			dialog.anchorsGroupNameByGuid = {};
indvd00m@0
    35
			
indvd00m@0
    36
			for (var i = 0; i < anchors.length; i++) {
indvd00m@0
    37
				var anchor = anchors[i];
indvd00m@0
    38
				var guid = anchor.guid;
indvd00m@0
    39
				var label = anchor.text;
indvd00m@0
    40
				anchorSelect.add(label, guid);
indvd00m@0
    41
				
indvd00m@0
    42
				if (type.groupAnchors == true && anchor.groupGuid) {
indvd00m@0
    43
					dialog.anchorsGroupNameByGuid[anchor.groupGuid] = anchor.groupName;
indvd00m@0
    44
				}
indvd00m@0
    45
				dialog.anchorsByGuid[guid] = anchor;
indvd00m@0
    46
			}
indvd00m@0
    47
			
indvd00m@0
    48
			if (type && type.groupAnchors == true) {
indvd00m@0
    49
				for (var groupGuid in dialog.anchorsGroupNameByGuid) {
indvd00m@0
    50
					var groupName = dialog.anchorsGroupNameByGuid[groupGuid];
indvd00m@0
    51
					anchorGroupSelect.add(groupName, groupGuid);
indvd00m@0
    52
				}
indvd00m@0
    53
			}
indvd00m@0
    54
			
indvd00m@0
    55
			// fix &nbsp; and others
indvd00m@0
    56
			$('option', anchorSelect.getInputElement().$).each(function() {
indvd00m@0
    57
				var option = $(this);
indvd00m@0
    58
				var text = option.text();
indvd00m@0
    59
				option.html(text);
indvd00m@0
    60
			});
indvd00m@0
    61
			
indvd00m@0
    62
			if (!dialog.insertMode)
indvd00m@0
    63
				anchorSelect.setup(dialog.element);
indvd00m@0
    64
			
indvd00m@0
    65
			dialog.setState(CKEDITOR.DIALOG_STATE_IDLE);
indvd00m@0
    66
		});
indvd00m@0
    67
	};
indvd00m@0
    68
	
indvd00m@0
    69
	var filterAnchors = function(dialog) {
indvd00m@0
    70
		var filter = dialog.getValueOf('tab-main', 'filter');
indvd00m@0
    71
		if (filter)
indvd00m@0
    72
			filter = filter.trim().toLowerCase();
indvd00m@0
    73
		else
indvd00m@0
    74
			filter = '';
indvd00m@0
    75
		
indvd00m@0
    76
		var type = null;
indvd00m@0
    77
		var typeName = dialog.getValueOf('tab-main', 'type');
indvd00m@0
    78
		if (typeName)
indvd00m@0
    79
			type = config.types[typeName];
indvd00m@0
    80
		
indvd00m@0
    81
		var groupGuid = null;
indvd00m@0
    82
		if (type && type.groupAnchors == true)
indvd00m@0
    83
			groupGuid = dialog.getValueOf('tab-main', 'anchorGroup');
indvd00m@0
    84
		
indvd00m@0
    85
		var anchorSelect = dialog.getContentElement('tab-main', 'anchor');
indvd00m@0
    86
		var prevValue = anchorSelect.getValue();
indvd00m@0
    87
		var selected = null;
indvd00m@0
    88
		$('option', anchorSelect.getInputElement().$).each(function() {
indvd00m@0
    89
			var option = $(this);
indvd00m@0
    90
			var guid = option.val();
indvd00m@0
    91
			var anchor = dialog.anchorsByGuid[guid];
indvd00m@0
    92
			var text = option.text();
indvd00m@0
    93
			
indvd00m@0
    94
			var matches = filter.length == 0 || text.toLowerCase().indexOf(filter) != -1;
indvd00m@0
    95
			if (groupGuid)
indvd00m@0
    96
				matches = matches && anchor && anchor.groupGuid == groupGuid;
indvd00m@0
    97
			
indvd00m@0
    98
			if (matches) {
indvd00m@0
    99
				option.removeAttr('disabled', 'disabled');
indvd00m@0
   100
				if (selected == null)
indvd00m@0
   101
					selected = option.val();
indvd00m@0
   102
				else if (guid == prevValue)
indvd00m@0
   103
					selected = option.val();
indvd00m@0
   104
			} else {
indvd00m@0
   105
				option.attr('disabled', 'disabled');
indvd00m@0
   106
			}
indvd00m@0
   107
		});
indvd00m@0
   108
		anchorSelect.setValue(selected);
indvd00m@0
   109
	};
indvd00m@0
   110
	
indvd00m@0
   111
	return {
indvd00m@0
   112
		title : editor.lang.crossreference.link,
indvd00m@0
   113
		minWidth : 400,
indvd00m@0
   114
		minHeight : 150,
indvd00m@0
   115
		
indvd00m@0
   116
		contents : [ 
indvd00m@0
   117
			{
indvd00m@0
   118
				id : 'tab-main',
indvd00m@0
   119
				label : editor.lang.crossreference.link,
indvd00m@0
   120
				elements : [ 
indvd00m@0
   121
					{
indvd00m@0
   122
						type : 'vbox',
indvd00m@0
   123
						widths : [ '100%' ],
indvd00m@0
   124
						children : [
indvd00m@0
   125
							{
indvd00m@0
   126
								type : 'html',
indvd00m@0
   127
								id : 'description',
indvd00m@0
   128
								html : '<div style="white-space: normal; text-align: justify;">' + editor.lang.crossreference.linkDescription + '</div>',
indvd00m@0
   129
							},
indvd00m@0
   130
							{
indvd00m@0
   131
								type : 'select',
indvd00m@0
   132
								id : 'type',
indvd00m@0
   133
								width: '100%',
indvd00m@0
   134
								label : editor.lang.crossreference.anchorType,
indvd00m@0
   135
								required: true,
indvd00m@0
   136
								items : [['']],
indvd00m@0
   137
								onLoad: function() {
indvd00m@0
   138
									this.getInputElement().setStyle('width', '100%');
indvd00m@0
   139
									for (var typeName in config.types) {
indvd00m@0
   140
										var type = config.types[typeName];
indvd00m@0
   141
										var label = type.name;
indvd00m@0
   142
										this.add(label, type.type);
indvd00m@0
   143
									}
indvd00m@0
   144
								},
indvd00m@0
   145
								onChange: function() {
indvd00m@0
   146
									updateAnchors(this.getDialog());
indvd00m@0
   147
								},
indvd00m@0
   148
								setup: function(element) {
indvd00m@0
   149
									this.setValue(element.getAttribute('cross-reference'));
indvd00m@0
   150
								},
indvd00m@0
   151
								commit: function(element) {
indvd00m@0
   152
									element.setAttribute('cross-reference', this.getValue());
indvd00m@0
   153
									element.setAttribute('cross-link', '');
indvd00m@0
   154
								}
indvd00m@0
   155
							},
indvd00m@0
   156
							{
indvd00m@0
   157
								type : 'select',
indvd00m@0
   158
								id : 'anchorGroup',
indvd00m@0
   159
								width: '100%',
indvd00m@0
   160
								label : editor.lang.crossreference.anchorGroup,
indvd00m@0
   161
								required: false,
indvd00m@0
   162
								items : [['']],
indvd00m@0
   163
								onLoad: function() {
indvd00m@0
   164
									this.getInputElement().setStyle('width', '100%');
indvd00m@0
   165
								},
indvd00m@0
   166
								onChange: function() {
indvd00m@0
   167
									filterAnchors(this.getDialog());
indvd00m@0
   168
								}
indvd00m@0
   169
							},
indvd00m@0
   170
							{
indvd00m@0
   171
								type : 'text',
indvd00m@0
   172
								id : 'filter',
indvd00m@0
   173
								width: '100%',
indvd00m@0
   174
								label : editor.lang.crossreference.linkFilter,
indvd00m@0
   175
								onKeyUp : function() {
indvd00m@0
   176
									filterAnchors(this.getDialog());
indvd00m@0
   177
								}
indvd00m@0
   178
							},
indvd00m@0
   179
							{
indvd00m@0
   180
								type : 'select',
indvd00m@0
   181
								id : 'anchor',
indvd00m@0
   182
								width: '100%',
indvd00m@0
   183
								label : editor.lang.crossreference.anchor,
indvd00m@0
   184
								required: true,
indvd00m@0
   185
								items : [['']],
indvd00m@0
   186
								onLoad: function() {
indvd00m@0
   187
									this.getInputElement().setStyle('width', '100%');
indvd00m@0
   188
								},
indvd00m@0
   189
								setup: function(element) {
indvd00m@0
   190
									this.setValue(element.getAttribute('cross-guid'));
indvd00m@0
   191
								},
indvd00m@0
   192
								commit: function(element) {
indvd00m@0
   193
									element.setAttribute('cross-guid', this.getValue());
indvd00m@0
   194
								}
indvd00m@0
   195
							}
indvd00m@0
   196
						]
indvd00m@0
   197
					} 
indvd00m@0
   198
				]
indvd00m@0
   199
			} 
indvd00m@0
   200
		],
indvd00m@0
   201
		
indvd00m@0
   202
		onLoad : function() {
indvd00m@0
   203
indvd00m@0
   204
		},
indvd00m@0
   205
		
indvd00m@0
   206
		onShow : function() {
indvd00m@0
   207
			var selection = editor.getSelection();
indvd00m@0
   208
			this.element = selection.getStartElement();
indvd00m@0
   209
			if (this.element)
indvd00m@0
   210
				this.element = this.element.getAscendant('a', true);
indvd00m@0
   211
			if (!this.element || this.element.getName() != 'a') {
indvd00m@0
   212
				this.element = editor.document.createElement('a');
indvd00m@0
   213
				this.element.setAttribute('cross-link', '');
indvd00m@0
   214
				this.insertMode = true;
indvd00m@0
   215
			} else {
indvd00m@0
   216
				this.insertMode = false;
indvd00m@0
   217
			}
indvd00m@0
   218
			
indvd00m@0
   219
			if (this.insertMode)
indvd00m@0
   220
				updateAnchors(this);
indvd00m@0
   221
			else
indvd00m@0
   222
				this.setupContent(this.element);
indvd00m@0
   223
		},
indvd00m@0
   224
		
indvd00m@0
   225
		onOk : function() {
indvd00m@0
   226
			if (!this.getValueOf('tab-main', 'type'))
indvd00m@0
   227
				return;
indvd00m@0
   228
			if (!this.getValueOf('tab-main', 'anchor'))
indvd00m@0
   229
				return;
indvd00m@0
   230
			
indvd00m@0
   231
			this.commitContent(this.element);
indvd00m@0
   232
			
indvd00m@0
   233
			if (this.insertMode)
indvd00m@0
   234
				editor.insertElement(this.element);
indvd00m@0
   235
			
indvd00m@0
   236
			editor.execCommand('update-crossreferences');
indvd00m@0
   237
		}
indvd00m@0
   238
		
indvd00m@0
   239
	};
indvd00m@0
   240
});