1ASPx.IS(function(ASPx, dx, DevExpress){ 2(function(dx) { 3 var BootstrapClientCardView = ASPx.CreateClass(ASPxClientCardView, { 4 constructor: function(name) { 5 this.constructor.prototype.constructor.call(this, name); 6 this.HeaderFilterButtonClassName = FILTER_BUTTON_CLASS; 7 this.checkBoxImageProperties = {}; 8 this.accessibilityCompliant = true; 9 }, 10 Initialize: function() { 11 ASPxClientCardView.prototype.Initialize.call(this); 12 this.attachHtmlHandlers(); 13 }, 14 InitializeAdjustment: function() { 15 ASPxClientCardView.prototype.InitializeAdjustment.call(this); 16 this.initializeCardImagesAdjustment(); 17 }, 18 attachHtmlHandlers: function() { 19 this.attachHeaderHandlers(); 20 this.attachMainContentHandlers(); 21 this.attachDataItemHandlers(); 22 }, 23 detachHtmlHandlers: function() { 24 }, 25 attachHeaderHandlers: function() { 26 var columnCount = this.columns.length; 27 for(var i = 0; i < columnCount; i++) 28 this.attachHeaderHandler(this.columns[i]); 29 }, 30 attachHeaderHandler: function(column) { 31 var headerElement = this.GetHeader(column.index, false) || this.GetHeader(column.index, true); 32 if(headerElement) this.attachHeaderHandlerOnElement(headerElement); 33 }, 34 attachHeaderHandlerOnElement: function(headerElement) { 35 ASPx.Evt.AttachEventToElement(headerElement, "mousedown", function(evt) { 36 this.HeaderMouseDown(headerElement, evt); 37 }.bind(this)); 38 var links = headerElement.querySelectorAll("a"); 39 for(var i = 0, link; link = links[i]; i++) 40 link.ondragstart = function() { return false; }; 41 var sortElements = headerElement.querySelectorAll(SELECTORS.HEADER_SORT); 42 for(var i = 0, sortEl; sortEl = sortElements[i]; i++) 43 this.attachHeaderSortHandler(sortEl, headerElement); 44 }, 45 attachHeaderSortHandler: function(el, headerElement) { 46 ASPx.Evt.AttachEventToElement(el, "click", function(evt) { 47 window.setTimeout(function() { 48 if(this.contextMenuActivating) { 49 this.contextMenuActivating = false; 50 return; 51 } 52 if(!this.canSortByColumn(headerElement) || this.InRegularCallback()) 53 return; 54 this.SortBy(this.getColumnIndex(headerElement.id), evt.ctrlKey ? "NONE" : "", !evt.shiftKey && !evt.ctrlKey); 55 }.bind(this), 0); 56 return ASPx.Evt.PreventEvent(evt); 57 }.bind(this)); 58 }, 59 InitializeBubbleEvents: function() { }, 60 attachMainContentHandlers: function () { 61 var mainTable = this.GetMainTable(); 62 ASPx.Evt.AttachEventToElement(mainTable, "click", function (evt) { 63 if(this.NeedProcessTableClick(evt)) 64 this.mainTableClick(evt); 65 }.bind(this), true); 66 ASPx.Evt.AttachEventToElement(mainTable, "dblclick", function (evt) { 67 if(this.NeedProcessTableClick(evt)) 68 this.mainTableDblClick(evt); 69 }.bind(this), true); 70 }, 71 attachDataItemHandlers: function() { 72 if(!this.allowBatchEditing) return; 73 var datachecks = this.GetMainElement().querySelectorAll(SELECTORS.BATCHEDIT_DATACHECK); 74 for (var i = 0, check; check = datachecks[i]; i++) { 75 if (!this.isCurrentCardViewElement(check)) continue; 76 if (!check.disabled) 77 this.attachDataCellCheckHandler(check); 78 } 79 var list = this.GetFocusableLayoutItemsList(); 80 for(var i = 0; i < this.pageRowCount; i++) { 81 var rowIndex = i + this.visibleStartIndex; 82 var row = this.GetDataItem(rowIndex); 83 if(row) { 84 for(var j = 0; j < list.length; j++) { 85 var itemPath = list[j].path; 86 var itemElement = this.GetFormLayoutItemCellByPath(rowIndex, itemPath); 87 if(itemElement) { 88 var dataElement = this.getDataElement(itemElement); 89 if(dataElement) dataElement.tabIndex = 0; 90 } 91 } 92 } 93 } 94 var batchEditHelperOwner = this.GetBatchEditHelperOwner(); 95 if(batchEditHelperOwner) { 96 var etalonItem = batchEditHelperOwner.GetEtalonNewItem(); 97 if(etalonItem) { 98 for(var j = 0; j < list.length; j++) { 99 var itemPath = list[j].path; 100 var itemElement = this.GetFormLayoutItemCellByPath(this.EtalonBatchRecordPostFix, itemPath); 101 if(itemElement) { 102 var dataElement = this.getDataElement(itemElement); 103 if(dataElement) dataElement.tabIndex = 0; 104 } 105 } 106 } 107 } 108 }, 109 attachDataCellCheckHandler: function (check) { 110 ASPx.Evt.AttachEventToElement(check, "click", function (evt) { 111 this.ProcessTableClick(evt, false); 112 }.bind(this)); 113 }, 114 prepareBatchEditors: function() { 115 var container = this.GetChildElement("DXBEsC"); 116 var editorsContainers = container.querySelectorAll("[data-dxci]"); 117 for(var i = editorsContainers.length - 1; i >= 0; i--) { 118 editorsContainers[i].id = this.name + "_" + "DXBEC" + ASPx.Attr.GetAttribute(editorsContainers[i], "data-dxci"); 119 } 120 }, 121 GetGridTD: function() { 122 return this.GetMainElement(); 123 }, 124 GetMainTable: function() { 125 return ASPx.GetNodeByClassName(this.GetMainElement(), "dxbs-content"); 126 }, 127 IsMainTableChildElement: function(src) { 128 if(!src) return true; 129 return ASPx.GetIsParent(this.GetMainTable(), src); 130 }, 131 GetFormLayoutItemCellByChild: function(element) { 132 var cell = ASPx.GetParentByClassName(element, "form-group"); 133 return cell ? cell.parentNode : null; 134 }, 135 GetLoadingPanelElement: function(){ 136 return ASPx.BootstrapLoadingPanelManager.getLoadingPanel(this.name, this.loadingPanel); 137 }, 138 GetLoadingDiv: function(){ 139 return ASPx.BootstrapLoadingPanelManager.getLoadingDiv(this.name, this.loadingPanel); 140 }, 141 IsRecoverButton: function(button) { 142 return ASPx.Attr.GetAttribute(button, "data-toggle") === DATA_TOGGLES.ROW_RECOVER; 143 }, 144 getDataElement: function(itemElement){ 145 var element = ASPx.GetNodeByClassName(itemElement, ASPx.BootstrapCssSelectors.FormControlStatic); 146 if(!element) 147 element = ASPx.GetNodeByClassName(itemElement, "form-group"); 148 return element; 149 }, 150 ShowLoadingPanelInsideHeaderFilterPopup: function() { 151 var popup = this.GetHeaderFilterPopup(); 152 var container = popup.GetContentContainer(-1); 153 var lp = ASPx.BootstrapLoadingPanelManager.getLoadingPanel(this.name + "_HF", this.loadingPanel, true); 154 if(lp) { 155 ASPx.Security.setInnerHtml(container, "", ASPx.Security.DataType.Trusted); 156 container.appendChild(lp); 157 popup.AfterSetWindowContentHtml(-1, container); 158 } 159 }, 160 CreateLoadingPanelInline: function(parentElement, centerInParent){ 161 var lp = ASPxClientGridView.prototype.CreateLoadingPanelInline.call(this, parentElement, centerInParent); 162 if(lp) lp.style.opacity = 1; 163 }, 164 ProcessFullCallbackResult: function(result) { 165 this.needAttachHtmlHandler = true; 166 this.detachHtmlHandlers(); 167 ASPxClientCardView.prototype.ProcessFullCallbackResult.call(this, result); 168 }, 169 OnCallbackFinalized: function() { 170 if(this.needAttachHtmlHandler) { 171 this.needAttachHtmlHandler = false; 172 this.attachHtmlHandlers(); 173 } 174 this.calculateCardsHeight(); 175 this.initializeCardImagesAdjustment(); 176 ASPxClientCardView.prototype.OnCallbackFinalized.call(this); 177 }, 178 allowRestoreFocusOnCallbacks: function(){ 179 return true; 180 }, 181 OnPopupEditFormInit: function(popup) { 182 popup.CloseUp.AddHandler(function(s, e) { 183 if (e.closeReason === ASPxClientPopupControlCloseReason.Escape || e.closeReason === ASPxClientPopupControlCloseReason.CloseButton) 184 this.ScheduleUserCommand(['CancelEdit', -1], false); 185 }.bind(this)); 186 ASPxClientCardView.prototype.OnPopupEditFormInit.call(this, popup); 187 }, 188 CreateBatchEditHelper: function() { return new ASPx.BootstrapCardViewBatchEditHelper(this.CreateBatchEditHelperOwner()); }, 189 CreateBatchEditHelperOwner: function() { return new ASPx.BootstrapCardViewBatchEditHelperOwner(this); }, 190 CreateCellFocusHelper: function() { return new ASPx.BootstrapCardViewCellFocusHelper(this); }, 191 CreateFilterHelper: function() { return new ASPx.BootstrapCardViewFilterHelper(this); }, 192 CreateCallbackHelper: function () { return new BootstrapCardViewCallbackHelper(this); }, 193 CreateToolbarHelper: function() { return new ASPx.BootstrapCardViewToolbarHelper(this); }, 194 CreateNavigationHelper: function() { 195 return typeof(ASPx.BootstrapCardViewNavigationHelper) != "undefined" ? new ASPx.BootstrapCardViewNavigationHelper(this) : null; 196 }, 197 CreateStyleHelper: function() { return new BootstrapCardViewStyleHelper(this); }, 198 CreateEndlessPagingHelper: function() { return new ASPx.BootstrapCardViewEndlessPagingHelper(this); }, 199 ApplyItemStyle: function(visibleIndex, styleInfo) { 200 var item = this.GetItem(visibleIndex); 201 var cardContent = ASPx.GetChildByClassName(item, CARD_CLASS);
202 this.ApplyElementStyle(cardContent || item, styleInfo); 203 }, 204 CreateEditingErrorItem: function() { 205 return document.createElement("div"); 206 }, 207 WrapErrorCard: function(card) { 208 var errorContainer = document.createElement("DIV"); 209 ASPx.AddClassNameToElement(errorContainer, this.ErrorCardErrorContainerClassName); 210 ASPx.AddClassNameToElement(errorContainer, ASPx.BootstrapCssSelectors.BackgroundDanger); 211 var cardContent = ASPx.GetChildByClassName(card, ASPx.BootstrapCssSelectors.Panel); 212 var cardBody = ASPx.GetChildByClassName(cardContent, ASPx.BootstrapCssSelectors.PanelBody); 213 cardContent.insertBefore(errorContainer, cardBody); 214 }, 215 PrepareCommandButtons: function() { 216 var mainElement = this.GetMainElement(); 217 var buttons = mainElement.querySelectorAll("[data-toggle]"); 218 for(var btn, i = 0; btn = buttons[i]; i++) { 219 var dataToggle = ASPx.Attr.GetAttribute(btn, "data-toggle"); 220 if(!COMMANDS[dataToggle] || !this.isCurrentCardViewElement(btn) || btn.hasHandler) continue; 221 ASPx.Evt.AttachEventToElement(btn, "click", this.OnCommandButtonClick.bind(this, btn, dataToggle)); 222 btn.hasHandler = true; 223 } 224 }, 225 OnCommandButtonClick: function(btn, dataToggle) { 226 if(this.accessibilityCompliant && ASPx.Attr.IsExistsAttribute(btn, ASPx.Attr.Aria.disabled)) 227 return; 228 var commandInfo = COMMANDS[dataToggle]; 229 if(!commandInfo.hasIndex) 230 this.ScheduleUserCommand([commandInfo.method], commandInfo.postponed, btn); 231 else if (commandInfo.hasArgs) { 232 var visibleIndex = this.tryFindParentCardIndex(btn); 233 var args = ASPx.Attr.GetAttribute(btn, "data-args"); 234 this.ScheduleUserCommand([commandInfo.method, args, visibleIndex >= 0 ? visibleIndex : INT32_MINVALUE], commandInfo.postponed, btn); 235 } 236 else { 237 var visibleIndex = this.tryFindParentCardIndex(btn); 238 this.ScheduleUserCommand([commandInfo.method, visibleIndex >= 0 ? visibleIndex : INT32_MINVALUE], commandInfo.postponed, btn); 239 } 240 }, 241 IsCancelButton: function(button) { 242 return ASPx.Attr.GetAttribute(button, "data-toggle") === "cardview-cancelchanges"; 243 }, 244 GetBatchEditCommandButtons: function() { 245 var mainElement = this.GetMainElement(); 246 var buttons = mainElement.querySelectorAll(SELECTORS.BATCHEDIT_SAVECHANGES + "," + SELECTORS.BATCHEDIT_CANCELCHANGES + "," + SELECTORS.BATCHEDIT_UPDATESUMMARIES); 247 var arr = []; 248 for(var btn, i = 0; btn = buttons[i]; i++) { 249 if(!this.isCurrentCardViewElement(btn)) continue; 250 arr.push(btn); 251 } 252 return arr; 253 }, 254 isCurrentCardViewElement: function(element) { 255 return ASPx.GetParentByClassName(element, CARDVIEW_CLASS) === this.GetMainElement(); 256 }, 257 tryFindParentCardIndex: function(element) { 258 var regEx = this.GetItemVisibleIndexRegExp(); 259 var cardEl = ASPx.GetParentByClassName(element, CARD_CLASS); 260 if(cardEl) { 261 var matches = regEx.exec(cardEl.parentNode.id); 262 if(matches && matches.length == 3) 263 return parseInt(matches[2]); 264 } 265 return -1; 266 }, 267 isHeaderFilterButton: function(el) { 268 return ASPx.Attr.GetAttribute(el, "data-toggle") === DATA_TOGGLES.FILTER_POPUP || 269 ASPx.Attr.GetAttribute(el.parentNode, "data-toggle") === DATA_TOGGLES.FILTER_POPUP; 270 }, 271 CreateInternalCheckBoxCollection: function() { 272 if(!this.internalCheckBoxCollection) 273 this.internalCheckBoxCollection = new ASPx.BootstrapCheckBoxInternalCollection(true, false, false); 274 this.CompleteInternalCheckBoxCollection(); 275 }, 276 IsNativeCheckBoxes: function() { 277 return false; 278 }, 279 IsCheckBoxDisabled: function(icbInputElement) { 280 return false; 281 }, 282 AddInternalCheckBoxToCollection: function(icbMainElement, visibleIndex, enabled) { 283 var internalCheckBox = null; 284 if(this.IsLastCallbackProcessedAsEndless()) 285 internalCheckBox = this.internalCheckBoxCollection.Get(icbMainElement.id); 286 if(internalCheckBox && internalCheckBox.mainElement != icbMainElement) { 287 this.internalCheckBoxCollection.Remove(icbMainElement.id); 288 internalCheckBox = null; 289 } 290 if(!internalCheckBox) { 291 internalCheckBox = this.internalCheckBoxCollection.Add(icbMainElement.id, icbMainElement); 292 if(visibleIndex >= 0) { 293 internalCheckBox.CheckedChanged.AddHandler(function(s, e) { 294 var rowCheckBox = this.GetDataRowSelBtn(visibleIndex); 295 if(this.allowSelectSingleRowOnly) 296 this._selectAllSelBtn(false, rowCheckBox.id); 297 if(!this.RaiseInternalCheckBoxClick(visibleIndex)) { 298 this.ScheduleCommand(function() { this.SelectItem(visibleIndex, s.GetChecked()); }.bind(this), true); 299 this.mainTableClickCore(e, true); 300 } 301 }.bind(this)); 302 } 303 else { 304 internalCheckBox.CheckedChanged.AddHandler(function(s, e) { 305 this.ScheduleCommand(function() { 306 var index = this.tryGetNumberFromEndOfString(s.mainElement.id).value; 307 var columnSelectAllSettings = this.GetColumnSelectAllSettings(index); 308 if(!columnSelectAllSettings) 309 return; 310 switch(columnSelectAllSettings.mode) { 311 case 1: 312 if(s.GetChecked()) 313 this.SelectAllRowsOnPage(); 314 else 315 this.UnselectAllRowsOnPage(); 316 break; 317 case 2: 318 if(s.GetChecked()) 319 this.SelectItemsCore(null, true, true); 320 else 321 this.UnselectFilteredItemsCore(true); 322 break; 323 } 324 this.UpdateSelectAllCheckboxesState(); 325 }.bind(this), true); 326 this.mainTableClickCore(e, true); 327 }.bind(this)); 328 } 329 } 330 },
331 selectItemCheckbox: function(visibleIndex, checked) { 332 var checkBox = this.GetDataRowSelBtn(visibleIndex); 333 if(checkBox) { 334 var internalCheckBox = this.internalCheckBoxCollection.Get(checkBox.id); 335 if(internalCheckBox) 336 internalCheckBox.SetValue(!!checked); 337 } 338 }, 339 GetDataRowSelBtn: function(index) { 340 var item = this.GetItem(index); 341 return item && item.querySelector(SELECTORS.ROW_SELECT_CHECKBOX); 342 }, 343 calculateCardsHeight: function() { 344 var cards = this.GetMainTable().querySelectorAll("." + CARD_CLASS + " > ." + ASPx.BootstrapCssSelectors.PanelBody); 345 var height = 0; 346 for(var i = 0; i < cards.length; i++) 347 cards[i].style.height = ""; 348 for(var i = 0; i < cards.length; i++){ 349 if(cards[i].offsetHeight > height) 350 height = cards[i].offsetHeight; 351 } 352 for(var i = 0; i < cards.length; i++) 353 cards[i].style.height = height + "px"; 354 }, 355 initializeCardImagesAdjustment: function() { 356 var images = this.GetMainTable().querySelectorAll("." + CARD_CLASS + " > ." + ASPx.BootstrapCssSelectors.PanelBody + " img"); 357 for(var i = 0; i < images.length; i++){ 358 if(!images[i].complete) 359 images[i].onload = function() { this.calculateCardsHeight(); }.bind(this); 360 } 361 }, 362 AdjustControlCore: function() { 363 this.calculateCardsHeight(); 364 this.UpdateScrollableControls(); 365 }, 366 OnBrowserWindowResize: function(e) { 367 this.AdjustControl(); 368 }, 369 BrowserWindowResizeSubscriber: function() { 370 return true; 371 }, 372 GetEditFormLayout: function() { return null; }, 373 GetEditFormLayoutItemByColumn: function(column) { return null; }, 374 GetEditFormLayoutItemOrGroup: function(name) { return null; } 375 }); 376 BootstrapClientCardView.postponeInit = function(name, info) { 377 var grid = ASPx.GetControlCollection().Get(name); 378 if(grid) { 379 if(grid.batchEditClientState) 380 grid.batchEditClientState.extraCommandButtonsInfo = info.extraCommandButtonsInfo; 381 grid.errorItemHtml = info.errorItemHtml; 382 grid.EnsureRowKeys(); 383 grid.UpdateItemsStyle(); 384 if(grid.allowBatchEditing) 385 grid.prepareBatchEditors(); 386 } 387 }; 388 var BootstrapCardViewCallbackHelper = ASPx.CreateClass(ASPx.GridCallbackHelper, { 389 ValidateCommand: function(command) { 390 if(command === ASPxClientGridViewCallbackCommand.DeleteRow && !this.GetAllowDelete()) { 391 console.error("Deleting is forbidden"); 392 return false; 393 } 394 if(command === ASPxClientGridViewCallbackCommand.StartEdit && !this.GetAllowEdit()) { 395 console.error("Editing is forbidden"); 396 return false; 397 } 398 if(command === ASPxClientGridViewCallbackCommand.AddNewRow && !this.GetAllowInsert()) { 399 console.error("Inserting is forbidden"); 400 return false; 401 } 402 return true; 403 }, 404 }); 405 var BootstrapCardViewStyleHelper = ASPx.CreateClass(ASPx.GridStyleHelper, { 406 GetStyleInfoCore: function(styleKey, keyPostFix) {
407 var cssClasses = this.grid.cssClasses; 408 switch(styleKey) { 409 case this.SelectedItemKey: 410 var selectedRowClassNames = []; 411 selectedRowClassNames.push(ASPx.BootstrapCore.IsBootstrap3 ? "well" : "bg-light"); 412 if(cssClasses[CSS_CLASSES.SELECTED_CARD]) 413 selectedRowClassNames.push(cssClasses[CSS_CLASSES.SELECTED_CARD]); 414 return { "className": selectedRowClassNames.join(" ").trim() }; 415 case this.FocusedItemKey: 416 var defaultCss = ASPx.BootstrapCore.IsBootstrap3 ? "panel-primary" : "border-primary"; 417 return { "className": cssClasses[CSS_CLASSES.FOCUSED_CARD] || defaultCss }; 418 case this.BatchEditModifiedCellKey: 419 return { "className": "dxbs-batch-changed bg-success" }; 420 case this.BatchEditDeletedItemKey: 421 return { "className": "dxbs-batch-changed deleted text-muted bg-warning" }; 422 } 423 } 424 }); 425 var FILTER_BUTTON_CLASS = "dxbs-header-button", 426 DATA_TOGGLES = { 427 ROW_RECOVER: "cardview-card-recover", 428 FILTER_POPUP: "cardview-column-filterpopup", 429 DATACELL_CHECK: "cardview-datacell-batchcheck" 430 }, 431 SELECTORS = { 432 FILTER_OK: "[data-toggle='cardview-filter-ok']", 433 FILTER_CANCEL: "[data-toggle='cardview-filter-cancel']", 434 HEADER_FILTER: "[data-toggle='cardview-column-filterpopup']", 435 HEADER_SORT: "[data-toggle='cardview-column-sort']", 436 BATCHEDIT_SAVECHANGES: "[data-toggle='cardview-savechanges']", 437 BATCHEDIT_CANCELCHANGES: "[data-toggle='cardview-cancelchanges']", 438 BATCHEDIT_UPDATESUMMARIES: "[data-toggle='cardview-updatesummaries']", 439 ROW_SELECT_CHECKBOX: "[data-toggle='cardview-card-selecteditor']", 440 BATCHEDIT_DATACHECK: "[data-toggle='" + DATA_TOGGLES.DATACELL_CHECK + "'] input" 441 }, 442 CARDVIEW_CLASS = "dxbs-cardview", 443 CARD_CLASS = "dxbs-card", 444 CSS_CLASSES = { 445 ICON_ERROR_ITEM: "iei", 446 SELECTED_CARD: "sc", 447 FOCUSED_CARD: "fc" 448 }, 449 COMMANDS = { 450 "cardview-savechanges": { method: "UpdateEdit", postponed: false }, 451 "cardview-cancelchanges": { method: "CancelEdit", postponed: false, hasIndex: true }, 452 "cardview-updatesummaries": { method: "UpdateSummaries", postponed: false }, 453 "cardview-newcard": { method: "AddNew", postponed: true }, 454 "cardview-card-edit": { method: "StartEdit", postponed: true, hasIndex: true }, 455 "cardview-card-delete": { method: "Delete", postponed: true, hasIndex: true }, 456 "cardview-card-custom": { method: "CustomButton", postponed: true, hasIndex: true, hasArgs: true }, 457 "cardview-card-recover": { method: "Recover", postponed: true, hasIndex: true }, 458 "cardview-card-select": { method: "Select", postponed: true, hasIndex: true }, 459 "cardview-card-selecteditor": {}, 460 "cardview-search-apply": { method: "ApplySearchFilter", postponed: false }, 461 "cardview-search-clear": { method: "ClearSearchFilter", postponed: false }, 462 "cardview-showmorecards": { method: "EndlessShowMore", postponed: false }, 463 }, 464 INT32_MINVALUE = -2147483647; 465 dx.BootstrapClientCardView = BootstrapClientCardView; 466 dx.BootstrapClientCardView.CONSTANTS = { 467 CSS_CLASSES: CSS_CLASSES, 468 COMMANDS: COMMANDS, 469 CARDVIEW_CLASS: CARDVIEW_CLASS, 470 CARD_CLASS: CARD_CLASS, 471 DATA_TOGGLES: DATA_TOGGLES, 472 SELECTORS: SELECTORS 473 }; 474})(dx || (dx = {})); 475 476},16);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.