jqGrid move to static
This commit is contained in:
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
@@ -0,0 +1,403 @@
|
||||
/*!
|
||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
||||
* No deletion without permission, or be held responsible to law.
|
||||
* @author ThinkGem
|
||||
* @version 2020-5-21
|
||||
*/
|
||||
/*Grid*/
|
||||
.ui-jqgrid {position: relative;}
|
||||
.ui-jqgrid .ui-jqgrid-view {position: relative;left:0; top: 0; padding: 0; font-size: 13px;}
|
||||
/* caption*/
|
||||
.ui-jqgrid .ui-jqgrid-titlebar {padding: .3em .2em .2em .3em; position: relative; font-size: 12px; border-left: 0 none;border-right: 0 none; border-top: 0 none;}
|
||||
.ui-jqgrid .ui-jqgrid-caption {text-align: left;}
|
||||
.ui-jqgrid .ui-jqgrid-title { margin: .1em 0 .2em; }
|
||||
.ui-jqgrid .ui-jqgrid-titlebar-close { position: absolute;top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height:18px; cursor:pointer;}
|
||||
.ui-jqgrid .ui-jqgrid-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-jqgrid .ui-jqgrid-titlebar-close:hover { padding: 0; }
|
||||
/* header*/
|
||||
.ui-jqgrid .ui-jqgrid-hdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}
|
||||
.ui-jqgrid .ui-jqgrid-hbox {float: left; padding-right: 20px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable {table-layout:fixed;margin:0;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th {height:22px;padding: 0 2px 0 2px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th div {overflow: hidden; position:relative; height:17px;}
|
||||
.ui-th-column, .ui-jqgrid .ui-jqgrid-htable th.ui-th-column {overflow: hidden;white-space: nowrap;text-align:center;border-top : 0 none;border-bottom : 0 none;}
|
||||
.ui-th-ltr, .ui-jqgrid .ui-jqgrid-htable th.ui-th-ltr {border-left : 0 none;}
|
||||
.ui-th-rtl, .ui-jqgrid .ui-jqgrid-htable th.ui-th-rtl {border-right : 0 none;}
|
||||
.ui-first-th-ltr {border-right: 1px solid; }
|
||||
.ui-first-th-rtl {border-left: 1px solid; }
|
||||
.ui-jqgrid .ui-th-div-ie {white-space: nowrap; zoom :1; height:17px;}
|
||||
.ui-jqgrid .ui-jqgrid-resize {height:20px !important;position: relative; cursor :e-resize;display: inline;overflow: hidden;}
|
||||
.ui-jqgrid .ui-grid-ico-sort {overflow:hidden;position:absolute;display:inline; cursor: pointer !important;}
|
||||
.ui-jqgrid .ui-icon-asc {margin-top:-3px; height:12px;}
|
||||
.ui-jqgrid .ui-icon-desc {margin-top:3px;height:12px;}
|
||||
.ui-jqgrid .ui-i-asc {margin-top:0;height:16px;}
|
||||
.ui-jqgrid .ui-i-desc {margin-top:0;margin-left:13px;height:16px;}
|
||||
.ui-jqgrid .ui-jqgrid-sortable {cursor:pointer;}
|
||||
.ui-jqgrid tr.ui-search-toolbar th { border-top-width: 1px !important; border-top-color: inherit !important; border-top-style: ridge !important }
|
||||
.ui-jqgrid tr.ui-search-toolbar input {margin: 1px 0 0 0}
|
||||
.ui-jqgrid tr.ui-search-toolbar select {margin: 1px 0 0 0}
|
||||
/* body */
|
||||
.ui-jqgrid .ui-jqgrid-bdiv {position: relative; margin: 0; padding:0; overflow: auto; text-align:left;}
|
||||
.ui-jqgrid .ui-jqgrid-btable {table-layout:fixed; margin:0; outline-style: none; }
|
||||
.ui-jqgrid tr.jqgrow { outline-style: none; }
|
||||
.ui-jqgrid tr.jqgroup { outline-style: none; }
|
||||
.ui-jqgrid tr.jqgrow td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid tr.jqgfirstrow td {padding: 0 2px 0 2px;border-right-width: 1px; border-right-style: solid;}
|
||||
.ui-jqgrid tr.jqgroup td {font-weight: normal; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid tr.jqfoot td {font-weight: bold; overflow: hidden; white-space: pre; height: 22px;padding: 0 2px 0 2px;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid tr.ui-row-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
|
||||
.ui-jqgrid tr.ui-row-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
|
||||
.ui-jqgrid td.jqgrid-rownum { padding: 0 2px 0 2px; margin: 0; border: 0 none;}
|
||||
.ui-jqgrid .ui-jqgrid-resize-mark { width:2px; left:0; background-color:#777; cursor: e-resize; cursor: col-resize; position:absolute; top:0; height:100px; overflow:hidden; display:none; border:0 none; z-index: 99999;}
|
||||
/* footer */
|
||||
.ui-jqgrid .ui-jqgrid-sdiv {position: relative; margin: 0;padding: 0; overflow: hidden; border-left: 0 none !important; border-top : 0 none !important; border-right : 0 none !important;}
|
||||
.ui-jqgrid .ui-jqgrid-ftable {table-layout:fixed; margin-bottom:0;}
|
||||
.ui-jqgrid tr.footrow td {font-weight: bold; overflow: hidden; white-space:nowrap; height: 21px;padding: 0 2px 0 2px;border-top-width: 1px; border-top-color: inherit; border-top-style: solid;}
|
||||
.ui-jqgrid tr.footrow-ltr td {text-align:left;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;}
|
||||
.ui-jqgrid tr.footrow-rtl td {text-align:right;border-left-width: 1px; border-left-color: inherit; border-left-style: solid;}
|
||||
/* Pager*/
|
||||
.ui-jqgrid .ui-jqgrid-pager { border-left: 0 none !important;border-right: 0 none !important; border-bottom: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px;white-space: nowrap;overflow: hidden;font-size: 13px;}
|
||||
.ui-jqgrid .ui-pager-control {position: relative;}
|
||||
.ui-jqgrid .ui-pg-table {position: relative; padding-bottom:2px; width:auto; margin: 0;}
|
||||
.ui-jqgrid .ui-pg-table td {font-weight:normal; vertical-align:middle; padding:1px;}
|
||||
.ui-jqgrid .ui-pg-button { height:19px !important;}
|
||||
.ui-jqgrid .ui-pg-button span { display: block; margin: 1px; float:left;}
|
||||
.ui-jqgrid .ui-pg-button:hover { padding: 0; }
|
||||
.ui-jqgrid .ui-state-disabled:hover {padding:1px;}
|
||||
.ui-jqgrid .ui-pg-input { height:13px;font-size:.8em; margin: 0;}
|
||||
.ui-jqgrid .ui-pg-selbox {font-size:.8em; line-height:18px; display:block; height:18px; margin: 0;}
|
||||
.ui-jqgrid .ui-separator {height: 18px; border-left: 1px solid #ccc ; border-right: 1px solid #ccc ; margin: 1px; float: right;}
|
||||
.ui-jqgrid .ui-paging-info {font-weight: normal;height:19px; margin-top:3px;margin-right:4px;}
|
||||
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div {padding:1px 0;float:left;position:relative;}
|
||||
.ui-jqgrid .ui-jqgrid-pager .ui-pg-button { cursor:pointer; }
|
||||
.ui-jqgrid .ui-jqgrid-pager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
|
||||
.ui-jqgrid td input, .ui-jqgrid td select, .ui-jqgrid td textarea { margin: 0;}
|
||||
.ui-jqgrid td textarea {width:auto;height:auto;}
|
||||
.ui-jqgrid .ui-jqgrid-toppager {border-left: 0 none !important;border-right: 0 none !important; border-top: 0 none !important; margin: 0 !important; padding: 0 !important; position: relative; height: 25px !important;white-space: nowrap;overflow: hidden;}
|
||||
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div {padding:1px 0;float:left;position:relative;}
|
||||
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-button { cursor:pointer; }
|
||||
.ui-jqgrid .ui-jqgrid-toppager .ui-pg-div span.ui-icon {float:left;margin:0 2px;}
|
||||
/*subgrid*/
|
||||
.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed {text-align:center;}
|
||||
.ui-jqgrid .ui-jqgrid-btable .ui-sgcollapsed span {display:inline-block;margin-top:3px;}
|
||||
.ui-jqgrid .ui-subgrid {margin:0;padding:0; width:100%;}
|
||||
.ui-jqgrid .ui-subgrid table {table-layout: fixed;}
|
||||
.ui-jqgrid .ui-subgrid tr.ui-subtblcell td {height:18px;border-right-width: 1px; border-right-color: inherit; border-right-style: solid;border-bottom-width: 1px; border-bottom-color: inherit; border-bottom-style: solid;}
|
||||
.ui-jqgrid .ui-subgrid td.subgrid-data {border-top: 0 none !important;}
|
||||
.ui-jqgrid .ui-subgrid td.subgrid-cell {border-width: 0 0 1px 0;}
|
||||
.ui-jqgrid .ui-th-subgrid {height:20px;}
|
||||
/* loading */
|
||||
.ui-jqgrid .loading {position: absolute; top: 45%;left: 45%;width: auto;z-index:101;padding: 6px; margin: 5px;text-align: center;font-weight: bold;display: none;border-width: 2px !important; font-size: 13px;}
|
||||
.ui-jqgrid .jqgrid-overlay {display:none;z-index:100;}
|
||||
/* IE * html .jqgrid-overlay {width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');} */
|
||||
* .jqgrid-overlay iframe {position:absolute;top:0;left:0;z-index:-1;}
|
||||
/* IE width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/
|
||||
/* end loading div */
|
||||
/* toolbar */
|
||||
.ui-jqgrid .ui-userdata {border-left: 0 none; border-right: 0 none; height : 21px;overflow: hidden; }
|
||||
/*Modal Window */
|
||||
.ui-jqgrid .ui-jqdialog { font-size: 13px; }
|
||||
.ui-jqdialog { display: none; width: 300px; position: absolute; padding: .2em; font-size: 13px; overflow:visible;}
|
||||
.ui-jqdialog .ui-jqdialog-titlebar { padding: .3em .2em; position: relative; }
|
||||
.ui-jqdialog .ui-jqdialog-title { margin: .1em 0 .2em; }
|
||||
.ui-jqdialog .ui-jqdialog-titlebar-close { position: absolute; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; cursor:pointer;}
|
||||
.ui-jqdialog .ui-jqdialog-titlebar-close span { display: block; margin: 1px; }
|
||||
.ui-jqdialog .ui-jqdialog-titlebar-close:hover, .ui-jqdialog .ui-jqdialog-titlebar-close:focus { padding: 0; }
|
||||
.ui-jqdialog-content, .ui-jqdialog .ui-jqdialog-content { border: 0; padding: .3em .2em; background: none; height:auto;}
|
||||
.ui-jqdialog .ui-jqconfirm {padding: .4em 1em; border-width:3px;position:absolute;bottom:10px;right:10px;overflow:visible;display:none;height:80px;width:220px;text-align:center;}
|
||||
.ui-jqdialog>.ui-resizable-se { bottom: -3px; right: -3px}
|
||||
.ui-jqgrid>.ui-resizable-se { bottom: -3px; right: -3px }
|
||||
/* end Modal window*/
|
||||
/* Form edit */
|
||||
.ui-jqdialog-content .FormGrid {margin: 0;}
|
||||
.ui-jqdialog-content .EditTable { width: 100%; margin-bottom:0;}
|
||||
.ui-jqdialog-content .DelTable { width: 100%; margin-bottom:0;}
|
||||
.EditTable td input, .EditTable td select, .EditTable td textarea {margin: 0;}
|
||||
.EditTable td textarea { width:auto; height:auto;}
|
||||
.ui-jqdialog-content td.EditButton {text-align: right;border-top: 0 none;border-left: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}
|
||||
.ui-jqdialog-content td.navButton {text-align: center; border-left: 0 none;border-top: 0 none;border-right: 0 none; padding-bottom:5px; padding-top:5px;}
|
||||
.ui-jqdialog-content input.FormElement {padding:.3em}
|
||||
.ui-jqdialog-content select.FormElement {padding:.3em}
|
||||
.ui-jqdialog-content .data-line {padding-top:.1em;border: 0 none;}
|
||||
|
||||
.ui-jqdialog-content .CaptionTD {vertical-align: middle;border: 0 none; padding: 2px;white-space: nowrap;}
|
||||
.ui-jqdialog-content .DataTD {padding: 2px; border: 0 none; vertical-align: top;}
|
||||
.ui-jqdialog-content .form-view-data {white-space:pre}
|
||||
.fm-button { display: inline-block; margin:0 4px 0 0; padding: .4em .5em; text-decoration:none !important; cursor:pointer; position: relative; text-align: center; zoom: 1; }
|
||||
.fm-button-icon-left { padding-left: 1.9em; }
|
||||
.fm-button-icon-right { padding-right: 1.9em; }
|
||||
.fm-button-icon-left .ui-icon { right: auto; left: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px; }
|
||||
.fm-button-icon-right .ui-icon { left: auto; right: .2em; margin-left: 0; position: absolute; top: 50%; margin-top: -8px;}
|
||||
#nData, #pData { float: left; margin:3px;padding: 0; width: 15px; }
|
||||
/* End Eorm edit */
|
||||
/*.ui-jqgrid .edit-cell {}*/
|
||||
.ui-jqgrid .selected-row, div.ui-jqgrid .selected-row td {font-style : normal;border-left: 0 none;}
|
||||
/* inline edit actions button*/
|
||||
.ui-inline-del.ui-state-hover span, .ui-inline-edit.ui-state-hover span,
|
||||
.ui-inline-save.ui-state-hover span, .ui-inline-cancel.ui-state-hover span { margin: -1px; }
|
||||
/* Tree Grid */
|
||||
.ui-jqgrid .tree-wrap {float: left; position: relative;height: 18px;white-space: nowrap;overflow: hidden;}
|
||||
.ui-jqgrid .tree-minus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
|
||||
.ui-jqgrid .tree-plus {position: absolute; height: 18px; width: 18px; overflow: hidden;}
|
||||
.ui-jqgrid .tree-leaf {position: absolute; height: 18px; width: 18px;overflow: hidden;}
|
||||
.ui-jqgrid .treeclick {cursor: pointer;}
|
||||
/* moda dialog */
|
||||
* iframe.jqm {position:absolute;top:0;left:0;z-index:-1;}
|
||||
/* width: expression(this.parentNode.offsetWidth+'px');height: expression(this.parentNode.offsetHeight+'px');}*/
|
||||
.ui-jqgrid-dnd tr td {border-right-width: 1px; border-right-color: inherit; border-right-style: solid; height:20px}
|
||||
/* RTL Support */
|
||||
.ui-jqgrid .ui-jqgrid-caption-rtl {text-align: right;}
|
||||
.ui-jqgrid .ui-jqgrid-hbox-rtl {float: right; padding-left: 20px;}
|
||||
.ui-jqgrid .ui-jqgrid-resize-ltr {float: right;margin: -2px -2px -2px 0;}
|
||||
.ui-jqgrid .ui-jqgrid-resize-rtl {float: left;margin: -2px 0 -1px -3px;}
|
||||
.ui-jqgrid .ui-sort-rtl {left:0;}
|
||||
.ui-jqgrid .tree-wrap-ltr {float: left;}
|
||||
.ui-jqgrid .tree-wrap-rtl {float: right;}
|
||||
.ui-jqgrid .ui-ellipsis {-moz-text-overflow:ellipsis;text-overflow:ellipsis;}
|
||||
|
||||
/* Toolbar Search Menu */
|
||||
.ui-search-menu { position: absolute; padding: 2px 5px;}
|
||||
.ui-search-menu.ui-menu .ui-menu-item { list-style-image: none; padding-right: 0; padding-left: 0; }
|
||||
.ui-search-menu.ui-menu .ui-menu-item a { display: block; }
|
||||
.ui-search-menu.ui-menu .ui-menu-item a.g-menu-item:hover { margin: -1px; font-weight: normal; }
|
||||
.ui-jqgrid .ui-search-table { padding: 0; border: 0 none; height:20px; width:100%;}
|
||||
.ui-jqgrid .ui-search-table .ui-search-oper { width:20px; }
|
||||
a.g-menu-item, a.soptclass, a.clearsearchclass { cursor: pointer; }
|
||||
.ui-jqgrid .ui-search-table .ui-search-input>input,
|
||||
.ui-jqgrid .ui-search-table .ui-search-input>select {display: block;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing: border-box;}
|
||||
.ui-jqgrid .ui-jqgrid-view input,.ui-jqgrid .ui-jqgrid-view select,
|
||||
.ui-jqgrid .ui-jqgrid-view textarea,.ui-jqgrid .ui-jqgrid-view button {font-size: 13px}
|
||||
|
||||
/* ========== jquery-ui icon for jeesite =========== */
|
||||
|
||||
.ui-icon {width:16px;height:16px;background-image:url(images/ui-icons_217bc0_256x240.png)!important;}
|
||||
.ui-icon-carat-1-n {background-position:0 0;}.ui-icon-carat-1-ne {background-position:-16px 0;}
|
||||
.ui-icon-carat-1-e {background-position:-32px 0;}.ui-icon-carat-1-se {background-position:-48px 0;}
|
||||
.ui-icon-carat-1-s {background-position:-64px 0;}.ui-icon-carat-1-sw {background-position:-80px 0;}
|
||||
.ui-icon-carat-1-w {background-position:-96px 0;}.ui-icon-carat-1-nw {background-position:-112px 0;}
|
||||
.ui-icon-carat-2-n-s {background-position:-128px 0;}.ui-icon-carat-2-e-w {background-position:-144px 0;}
|
||||
.ui-icon-triangle-1-n {background-position:0 -16px;}.ui-icon-triangle-1-ne {background-position:-16px -16px;}
|
||||
.ui-icon-triangle-1-e {background-position:-32px -16px;}.ui-icon-triangle-1-se {background-position:-48px -16px;}
|
||||
.ui-icon-triangle-1-s {background-position:-65px -16px;}.ui-icon-triangle-1-sw {background-position:-80px -16px;}
|
||||
.ui-icon-triangle-1-w {background-position:-96px -16px;}.ui-icon-triangle-1-nw {background-position:-112px -16px;}
|
||||
.ui-icon-triangle-2-n-s {background-position:-128px -16px;}.ui-icon-triangle-2-e-w {background-position:-144px -16px;}
|
||||
.ui-icon-radio-off {background-position:-96px -144px;}.ui-icon-radio-on {background-position:-112px -144px;}
|
||||
.ui-icon-arrow-1-n {background-position:0 -32px;}.ui-icon-arrow-1-ne {background-position:-16px -32px;}
|
||||
.ui-icon-arrow-1-e {background-position:-32px -32px;}.ui-icon-arrow-1-se {background-position:-48px -32px;}
|
||||
.ui-icon-arrow-1-s {background-position:-64px -32px;}.ui-icon-arrow-1-sw {background-position:-80px -32px;}
|
||||
.ui-icon-arrow-1-w {background-position:-96px -32px;}.ui-icon-arrow-1-nw {background-position:-112px -32px;}
|
||||
.ui-icon-arrow-2-n-s {background-position:-128px -32px;}.ui-icon-arrow-2-ne-sw {background-position:-144px -32px;}
|
||||
.ui-icon-arrow-2-e-w {background-position:-160px -32px;}.ui-icon-arrow-2-se-nw {background-position:-176px -32px;}
|
||||
.ui-icon-arrowstop-1-n {background-position:-192px -32px;}.ui-icon-arrowstop-1-e {background-position:-208px -32px;}
|
||||
.ui-icon-arrowstop-1-s {background-position:-224px -32px;}.ui-icon-arrowstop-1-w {background-position:-240px -32px;}
|
||||
.ui-icon-arrowthick-1-n {background-position:0 -48px;}.ui-icon-arrowthick-1-ne {background-position:-16px -48px;}
|
||||
.ui-icon-arrowthick-1-e {background-position:-32px -48px;}.ui-icon-arrowthick-1-se {background-position:-48px -48px;}
|
||||
.ui-icon-arrowthick-1-s {background-position:-64px -48px;}.ui-icon-arrowthick-1-sw {background-position:-80px -48px;}
|
||||
.ui-icon-arrowthick-1-w {background-position:-96px -48px;}.ui-icon-arrowthick-1-nw {background-position:-112px -48px;}
|
||||
.ui-icon-arrowthick-2-n-s {background-position:-128px -48px;}.ui-icon-arrowthick-2-ne-sw {background-position:-144px -48px;}
|
||||
.ui-icon-arrowthick-2-e-w {background-position:-160px -48px;}.ui-icon-arrowthick-2-se-nw {background-position:-176px -48px;}
|
||||
.ui-icon-arrowthickstop-1-n {background-position:-192px -48px;}.ui-icon-arrowthickstop-1-e {background-position:-208px -48px;}
|
||||
.ui-icon-arrowthickstop-1-s {background-position:-224px -48px;}.ui-icon-arrowthickstop-1-w {background-position:-240px -48px;}
|
||||
.ui-icon-arrowreturnthick-1-w {background-position:0 -64px;}.ui-icon-arrowreturnthick-1-n {background-position:-16px -64px;}
|
||||
.ui-icon-arrowreturnthick-1-e {background-position:-32px -64px;}.ui-icon-arrowreturnthick-1-s {background-position:-48px -64px;}
|
||||
.ui-icon-arrowreturn-1-w {background-position:-64px -64px;}.ui-icon-arrowreturn-1-n {background-position:-80px -64px;}
|
||||
.ui-icon-arrowreturn-1-e {background-position:-96px -64px;}.ui-icon-arrowreturn-1-s {background-position:-112px -64px;}
|
||||
.ui-icon-arrowrefresh-1-w {background-position:-128px -64px;}.ui-icon-arrowrefresh-1-n {background-position:-144px -64px;}
|
||||
.ui-icon-arrowrefresh-1-e {background-position:-160px -64px;}.ui-icon-arrowrefresh-1-s {background-position:-176px -64px;}
|
||||
.ui-icon-arrow-4 {background-position:0 -80px;}.ui-icon-arrow-4-diag {background-position:-16px -80px;}
|
||||
.ui-icon-extlink {background-position:-32px -80px;}.ui-icon-newwin {background-position:-48px -80px;}
|
||||
.ui-icon-refresh {background-position:-64px -80px;}.ui-icon-shuffle {background-position:-80px -80px;}
|
||||
.ui-icon-transfer-e-w {background-position:-96px -80px;}.ui-icon-transferthick-e-w {background-position:-112px -80px;}
|
||||
.ui-icon-folder-collapsed {background-position:0 -96px;}.ui-icon-folder-open {background-position:-16px -96px;}
|
||||
.ui-icon-document {background-position:-32px -96px;}.ui-icon-document-b {background-position:-48px -96px;}
|
||||
.ui-icon-note {background-position:-64px -96px;}.ui-icon-mail-closed {background-position:-80px -96px;}
|
||||
.ui-icon-mail-open {background-position:-96px -96px;}.ui-icon-suitcase {background-position:-112px -96px;}
|
||||
.ui-icon-comment {background-position:-128px -96px;}.ui-icon-person {background-position:-144px -96px;}
|
||||
.ui-icon-print {background-position:-160px -96px;}.ui-icon-trash {background-position:-176px -96px;}
|
||||
.ui-icon-locked {background-position:-192px -96px;}.ui-icon-unlocked {background-position:-208px -96px;}
|
||||
.ui-icon-bookmark {background-position:-224px -96px;}.ui-icon-tag {background-position:-240px -96px;}
|
||||
.ui-icon-home {background-position:0 -112px;}.ui-icon-flag {background-position:-16px -112px;}
|
||||
.ui-icon-calendar {background-position:-32px -112px;}.ui-icon-cart {background-position:-48px -112px;}
|
||||
.ui-icon-pencil {background-position:-64px -112px;}.ui-icon-clock {background-position:-80px -112px;}
|
||||
.ui-icon-disk {background-position:-96px -112px;}.ui-icon-calculator {background-position:-112px -112px;}
|
||||
.ui-icon-zoomin {background-position:-128px -112px;}.ui-icon-zoomout {background-position:-144px -112px;}
|
||||
.ui-icon-search {background-position:-160px -112px;}.ui-icon-wrench {background-position:-176px -112px;}
|
||||
.ui-icon-gear {background-position:-192px -112px;}.ui-icon-heart {background-position:-208px -112px;}
|
||||
.ui-icon-star {background-position:-224px -112px;}.ui-icon-link {background-position:-240px -112px;}
|
||||
.ui-icon-cancel {background-position:0 -128px;}.ui-icon-plus {background-position:-16px -128px;}
|
||||
.ui-icon-plusthick {background-position:-32px -128px;}.ui-icon-minus {background-position:-48px -128px;}
|
||||
.ui-icon-minusthick {background-position:-64px -128px;}.ui-icon-close {background-position:-80px -128px;}
|
||||
.ui-icon-closethick {background-position:-96px -128px;}.ui-icon-key {background-position:-112px -128px;}
|
||||
.ui-icon-lightbulb {background-position:-128px -128px;}.ui-icon-scissors {background-position:-144px -128px;}
|
||||
.ui-icon-clipboard {background-position:-160px -128px;}.ui-icon-copy {background-position:-176px -128px;}
|
||||
.ui-icon-contact {background-position:-192px -128px;}.ui-icon-image {background-position:-208px -128px;}
|
||||
.ui-icon-video {background-position:-224px -128px;}.ui-icon-script {background-position:-240px -128px;}
|
||||
.ui-icon-alert {background-position:0 -144px;}.ui-icon-info {background-position:-16px -144px;}
|
||||
.ui-icon-notice {background-position:-32px -144px;}.ui-icon-help {background-position:-48px -144px;}
|
||||
.ui-icon-check {background-position:-64px -144px;}.ui-icon-bullet {background-position:-80px -144px;}
|
||||
.ui-icon-radio-off {background-position:-96px -144px;}.ui-icon-radio-on {background-position:-112px -144px;}
|
||||
.ui-icon-pin-w {background-position:-128px -144px;}.ui-icon-pin-s {background-position:-144px -144px;}
|
||||
.ui-icon-play {background-position:0 -160px;}.ui-icon-pause {background-position:-16px -160px;}
|
||||
.ui-icon-seek-next {background-position:-32px -160px;}.ui-icon-seek-prev {background-position:-48px -160px;}
|
||||
.ui-icon-seek-end {background-position:-64px -160px;}.ui-icon-seek-start {background-position:-80px -160px;}
|
||||
.ui-icon-stop {background-position:-96px -160px;}.ui-icon-eject {background-position:-112px -160px;}
|
||||
.ui-icon-volume-off {background-position:-128px -160px;}.ui-icon-volume-on {background-position:-144px -160px;}
|
||||
.ui-icon-power {background-position:0 -176px;}.ui-icon-signal-diag {background-position:-16px -176px;}
|
||||
.ui-icon-signal {background-position:-32px -176px;}.ui-icon-battery-0 {background-position:-48px -176px;}
|
||||
.ui-icon-battery-1 {background-position:-64px -176px;}.ui-icon-battery-2 {background-position:-80px -176px;}
|
||||
.ui-icon-battery-3 {background-position:-96px -176px;}.ui-icon-circle-plus {background-position:0 -192px;}
|
||||
.ui-icon-circle-minus {background-position:-16px -192px;}.ui-icon-circle-close {background-position:-32px -192px;}
|
||||
.ui-icon-circle-triangle-e {background-position:-48px -192px;}.ui-icon-circle-triangle-s {background-position:-64px -192px;}
|
||||
.ui-icon-circle-triangle-w {background-position:-80px -192px;}.ui-icon-circle-triangle-n {background-position:-96px -192px;}
|
||||
.ui-icon-circle-arrow-e {background-position:-112px -192px;}.ui-icon-circle-arrow-s {background-position:-128px -192px;}
|
||||
.ui-icon-circle-arrow-w {background-position:-144px -192px;}.ui-icon-circle-arrow-n {background-position:-160px -192px;}
|
||||
.ui-icon-circle-zoomin {background-position:-176px -192px;}.ui-icon-circle-zoomout {background-position:-192px -192px;}
|
||||
.ui-icon-circle-check {background-position:-208px -192px;}.ui-icon-circlesmall-plus {background-position:0 -208px;}
|
||||
.ui-icon-circlesmall-minus {background-position:-16px -208px;}.ui-icon-circlesmall-close {background-position:-32px -208px;}
|
||||
.ui-icon-squaresmall-plus {background-position:-48px -208px;}.ui-icon-squaresmall-minus {background-position:-64px -208px;}
|
||||
.ui-icon-squaresmall-close {background-position:-80px -208px;}.ui-icon-grip-dotted-vertical {background-position:0 -224px;}
|
||||
.ui-icon-grip-dotted-horizontal {background-position:-16px -224px;}.ui-icon-grip-solid-vertical {background-position:-32px -224px;}
|
||||
.ui-icon-grip-solid-horizontal {background-position:-48px -224px;}.ui-icon-gripsmall-diagonal-se {background-position:-64px -224px;}
|
||||
.ui-icon-grip-diagonal-se {background-position:-80px -224px;}
|
||||
|
||||
/* ========== jqGrid for jeesite =========== */
|
||||
|
||||
.ui-widget-content {border:1px solid #e5e5e5;background:#fff;}
|
||||
.ui-jqgrid .ui-jqgrid-view, .ui-jqgrid .ui-jqgrid-view input,.ui-jqgrid .ui-jqgrid-view select,
|
||||
.ui-jqgrid .ui-jqgrid-view textarea,.ui-jqgrid .ui-jqgrid-view button {font-size:14px;}
|
||||
.ui-jqgrid .ui-jqgrid-view textarea {padding-bottom:3px;}
|
||||
.ui-jqgrid .ui-priority-secondary {background:#fafafa;}
|
||||
.ui-jqgrid table {border-collapse:separate!important;}
|
||||
|
||||
/* header */
|
||||
.ui-jqgrid .ui-jqgrid-hdiv {line-height:15px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th {height:39px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th div {padding:9px 0 8px 2px;line-height:17px;}
|
||||
.ui-jqgrid .ui-jqgrid-labels th {border-right:1px solid #ddd;font-weight:normal;text-align:center;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th.ui-th-column {border-bottom:1px solid #ddd;position:relative;overflow:visible;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th.ui-th-column-header {border-bottom:1px solid #ddd;padding:5px 4px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable .cbox {margin-top:1px;} /* v4.7 */
|
||||
.ui-jqgrid .ui-jqgrid-htable .ui-th-div {margin-top:0;font-weight:normal;}
|
||||
.ui-jqgrid .ui-jqgrid-htable .jqg-third-row-header .ui-th-div {margin-top:3px;}
|
||||
.ui-jqgrid .ui-state-disabled {opacity:.35;filter:Alpha(Opacity=35);background-image:none;}
|
||||
.ui-jqgrid .ui-jqgrid-resize__ {position:absolute;right:-2px;top:2px;z-index:1;width:8px;height:34px!important;}
|
||||
.ui-jqgrid .ui-jqgrid-resize {height:35px !important;}
|
||||
.ui-jqgrid .ui-icon-desc {margin-top:4px;margin-left:0;}
|
||||
.ui-jqgrid .ui-icon-asc {margin-top:-2px;}
|
||||
.ui-jqgrid .ui-search-toolbar {border:0;}
|
||||
.ui-jqgrid .ui-search-toolbar th div {padding:2px 0;}
|
||||
.ui-jqgrid .ui-search-toolbar th.ui-th-column {border-right:1px solid #ddd;}
|
||||
.ui-jqgrid .ui-search-toolbar th.ui-th-column input {border:1px solid #ddd;font-weight:normal;}
|
||||
|
||||
/* body */
|
||||
.ui-jqgrid .ui-widget-content {border:1px solid #ddd;}
|
||||
.ui-jqgrid tr.jqgrow, .ui-jqgrid tr.ui-row-ltr, .ui-jqgrid tr.ui-row-rtl {border:none;}
|
||||
.ui-jqgrid tr.ui-row-ltr td, .ui-jqgrid tr.ui-row-rtl td {border-color:#e1e1e1;border-bottom:1px solid #e1e1e1;}
|
||||
.ui-jqgrid tr.jqgrow td {height:39px;padding:3px 6px;white-space:nowrap;text-overflow:ellipsis;} /* 溢出省略 */
|
||||
.ui-jqgrid tr.jqgrow td.clip {text-overflow:clip;} /* 不显示省略号,截断显示 */
|
||||
.ui-jqgrid tr.jqgrow td.actions {overflow-x:auto;text-overflow:clip;} /* 操作列样式 */
|
||||
.ui-jqgrid tr.jqgrow td.textarea {white-space:normal;} /* 允许单元格换行 */
|
||||
.ui-jqgrid td.jqgrid-rownum {padding:0 !important;margin:0;border:0 none;} /* 序号 */
|
||||
.ui-jqgrid tr.jqgrow td.jqgrid-multibox {text-overflow:clip;} /* 复选框列样式 */
|
||||
.ui-jqgrid tr.jqgrow td.cb {padding:1px 0 0 1px;text-overflow:clip;}
|
||||
.ui-jqgrid tr.jqgrow td.cb,.ui-jqgrid .ui-jqgrid-htable th.cb {text-overflow:clip;}/* 复选框列样式 4.7 */
|
||||
.ui-jqgrid .ui-jqgrid-btable {padding-bottom:18px;position:relative;border-collapse:collapse;} /* 表单验证 */
|
||||
.ui-jqgrid .ui-jqgrid-btable label.has-error{margin-bottom:0;} /* 表单验证 */
|
||||
/* .ui-jqgrid .ui-jqgrid-btable .cbox {margin-top:3px;margin-left:2px;} 复选框 */
|
||||
.ui-jqgrid-table-striped > tbody > tr:nth-of-type(odd) {background-color:#fafafa;opacity:1;} /* 斑马线 */
|
||||
.ui-jqgrid tr.ui-state-highlight td {background-color:#e3edf5;} /* 当前行 */
|
||||
|
||||
/* footer */
|
||||
.ui-jqgrid tr.jqgroup td {height:32px;padding:0 2px;background:#fff;} /* 分组标题 */
|
||||
.ui-jqgrid tr.jqfoot td {height:25px;padding:0 2px;background:#fafafa;font-size:12px;} /* 分组小计 #f0fffb*/
|
||||
.ui-jqgrid tr.footrow td {height:28px;padding:0 2px;background:#e6e6e6;} /* 合计 */
|
||||
|
||||
/* frozen */
|
||||
.ui-jqgrid .frozen-div .ui-jqgrid-resize-ltr,
|
||||
.ui-jqgrid .frozen-div .ui-jqgrid-resize-rtl {margin:2px -2px -2px 0;}
|
||||
.ui-jqgrid .frozen-bdiv {overflow:hidden;} /* ie9冻结滚动条 */
|
||||
.ui-jqgrid .frozen-bdiv .ui-jqgrid-btable {padding-bottom:19px;} /* ie9冻结拖到底部对齐 */
|
||||
.ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:36px!important;}
|
||||
.ui-jqgrid .frozen-left th.ui-th-ltr,
|
||||
.ui-jqgrid .frozen-left tr.ui-row-ltr td {border-right:1px solid #eaeaea;}
|
||||
.ui-jqgrid .frozen-right th.ui-th-ltr,
|
||||
.ui-jqgrid .frozen-right tr.ui-row-ltr td {border-right:0;border-left:1px solid #eaeaea;}
|
||||
.ui-jqgrid .frozen-bdiv.frozen-left {box-shadow:6px 0 8px -5px rgba(0,0,0,.12);}
|
||||
.ui-jqgrid .frozen-bdiv.frozen-right {box-shadow:-6px 0 8px -5px rgba(0,0,0,.12);}
|
||||
|
||||
/* subgrid */
|
||||
.ui-jqgrid .tablediv{padding:3px;}
|
||||
|
||||
/* editgrid */
|
||||
.ui-jqgrid .editable{height:33px;}
|
||||
.ui-jqgrid .editable.icheck{padding-top:0;overflow:hidden;background:transparent;}
|
||||
.ui-jqgrid .editable .input-group {z-index:1;/* 显示到锁定列下面 */}
|
||||
.ui-jqgrid .editable .wup_container .placeholder p {display:none;}
|
||||
.ui-jqgrid .editable .wup_container .queueList .table {margin-bottom:2px;}
|
||||
.ui-jqgrid .editable .wup_container .placeholder .webuploader-pick {margin:0 auto 0 auto;}
|
||||
.ui-jqgrid .editable .wup_container .wup_img .placeholder {padding:0;}
|
||||
.ui-jqgrid .editable .wup_container .wup_img .placeholder .webuploader-pick {margin: 3px 0 0 0;}
|
||||
.ui-jqgrid .editable .wup_container .wup_input {top:10px;left:2%;}
|
||||
.ui-jqgrid .editgrid tr.ui-state-hover.ui-row-ltr td {background-color:#fafafa;}
|
||||
.ui-jqgrid .editgrid tr.ui-state-highlight.ui-row-ltr td {background-color:#f6fbff;}
|
||||
|
||||
/* TreeGrid */
|
||||
.ui-jqgrid .tree-leaf {opacity:.35;filter:Alpha(Opacity=35);}
|
||||
.ui-jqgrid .treeclick {margin-top:2px;}
|
||||
|
||||
/* 更多操作列 */
|
||||
.ui-jqgrid .actions > a i {display:inline-block;width:15px;float:none;position:static;
|
||||
text-align:center;opacity:0.85;-webkit-transition:all 0.12s;-o-transition:all 0.12s;
|
||||
transition:all 0.12s;margin:0 0 2px 3px;vertical-align:middle;cursor:pointer;font-size:14px;}
|
||||
.ui-jqgrid .actions > a i:hover, .ui-jqgrid .actions > a.open i {
|
||||
-moz-transform:scale(1.2);-webkit-transform:scale(1.2);-o-transform:scale(1.2);
|
||||
-ms-transform:scale(1.2);transform:scale(1.2);opacity:1;position:static;margin:0 0 2px 3px;}
|
||||
.ui-jqgrid .actions > a i.glyphicon {font-size:13px;}
|
||||
.ui-jqgrid .actions > a i.fa-check {color:#1e5edb;}
|
||||
.ui-jqgrid .actions > a i.fa-pencil, .ui-jqgrid .actions > a i.glyphicon-ok-circle {color:#108c53;}
|
||||
.ui-jqgrid .actions > a i.fa-trash-o, .ui-jqgrid .actions > a i.glyphicon-ban-circle {color:#dd5a43;}
|
||||
.ui-jqgrid .actions .moreItems {padding:5px 0 0 5px;background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:2px 2px 15px #ccc;position:absolute;z-index:5;display:none;}
|
||||
.ui-jqgrid .actions .moreItems a {padding:1px 5px 2px;margin:0 0 4px 0;font-size:13px;}
|
||||
|
||||
/* 拖动表格样式 */
|
||||
.ui-jqgrid tr.dragClass td,
|
||||
.ui-jqgrid tr.dragClass td input,
|
||||
.ui-jqgrid tr.dragClass td .select2-container--default .select2-selection--single {
|
||||
/*color:yellow!important;*/
|
||||
background-color:rgb(240 242 245 / 57%)!important;
|
||||
/*text-shadow:0 0 10px #ddd, 0 0 10px #ddd, 0 0 8px #ddd, 0 0 6px #ddd, 0 0 6px #ddd;*/
|
||||
/*box-shadow:0 12px 14px -12px #111 inset, 0 -2px 2px -1px #333 inset;*/
|
||||
}
|
||||
.ui-jqgrid tr.dragClass td .select2-container--default .select2-selection--single .select2-selection__rendered {
|
||||
/*color:yellow!important;*/
|
||||
}
|
||||
/* 拖拽表头目标样式 */
|
||||
.ui-jqgrid .ui-state-highlight {background:#eee;}
|
||||
/* 排序表格列头样式 */
|
||||
.sort-header,.sort-column {margin:13px 20px;}
|
||||
.sort-header .icheck,.sort-column .icheck {display:inline-block;min-width:150px;}
|
||||
.check_all{position:absolute;left:20px;bottom:7px;}
|
||||
|
||||
/* 标题自动换行 */
|
||||
/* th.ui-th-column div{white-space:normal!important;height:auto!important;padding:0;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th div{padding-top:2px;} */
|
||||
th.ui-th-column div{white-space:normal!important;height:auto!important;}
|
||||
/* .ui-jqgrid .ui-jqgrid-htable th div{height:auto!important;} */
|
||||
|
||||
/* 调整标题高度
|
||||
.ui-jqgrid .ui-jqgrid-htable th {height:24px;}
|
||||
.ui-jqgrid .ui-jqgrid-htable th div {padding:4px 0 3px 2px;}
|
||||
.ui-jqgrid .ui-jqgrid-frozen .ui-jqgrid-htable th div {height:24px!important;} */
|
||||
|
||||
/* print style */
|
||||
@media print {
|
||||
a[href]:after {content:""!important;}
|
||||
abbr[title]:after {content:""!important;}
|
||||
#pager{display:none;z-index:-1;}
|
||||
#accordion h3, #vcol, div.loading, div.ui-tabs-hide,ul.ui-tabs-nav li, td.HeaderRight {display:none }
|
||||
.ui-widget-content {border-width:1px 0 0 1px!important;}
|
||||
.ui-jqgrid-titlebar, .ui-jqgrid-title {display:none }
|
||||
.ui-jqgrid-bdiv_self {position:relative;margin:0em;padding:0;text-align:left;}
|
||||
.ui-jqgrid-bdiv, .ui-jqgrid-bdiv>div {height:auto!important;}
|
||||
.ui-jqgrid .ui-jqgrid-btable {padding-bottom:0;}
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
;(function($){
|
||||
/**
|
||||
* jqGrid English Translation
|
||||
* Tony Tomov tony@trirand.com
|
||||
* http://trirand.com/blog/
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
**/
|
||||
$.jgrid = $.jgrid || {};
|
||||
$.extend($.jgrid,{
|
||||
extend : {
|
||||
btnSearch: 'Search',
|
||||
btnHideSearch: 'Hide Search',
|
||||
expandTooMany: 'You need to expand the "{0}" node, because there are too many nodes, and the execution is canceled.',
|
||||
pageTitle: 'Click the number, you can fill in the page number of pages, press enter to take effect!',
|
||||
// pageLabelA: 'Page',
|
||||
// pageLabelB: ' / ',
|
||||
// pageLabelC: 'of {0}',
|
||||
pageLabelA: 'total of {0}',
|
||||
pageLabelB: '',
|
||||
pageLabelC: '/ page, Go to ',
|
||||
pageLabelD: ''
|
||||
},
|
||||
defaults : {
|
||||
recordtext: "View {0} - {1} of {2}",
|
||||
emptyrecords: "No records to view",
|
||||
loadtext: "Loading...",
|
||||
pgtext : "Page {0} of {1}",
|
||||
pgfirst : "First Page",
|
||||
pglast : "Last Page",
|
||||
pgnext : "Next Page",
|
||||
pgprev : "Previous Page",
|
||||
pgrecs : "Records per Page",
|
||||
showhide: "Toggle Expand Collapse Grid"
|
||||
},
|
||||
search : {
|
||||
caption: "Search...",
|
||||
Find: "Find",
|
||||
Reset: "Reset",
|
||||
odata: [{ oper:'eq', text:'equal'},{ oper:'ne', text:'not equal'},{ oper:'lt', text:'less'},{ oper:'le', text:'less or equal'},{ oper:'gt', text:'greater'},{ oper:'ge', text:'greater or equal'},{ oper:'bw', text:'begins with'},{ oper:'bn', text:'does not begin with'},{ oper:'in', text:'is in'},{ oper:'ni', text:'is not in'},{ oper:'ew', text:'ends with'},{ oper:'en', text:'does not end with'},{ oper:'cn', text:'contains'},{ oper:'nc', text:'does not contain'},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}],
|
||||
groupOps: [{ op: "AND", text: "all" },{ op: "OR", text: "any" }],
|
||||
operandTitle : "Click to select search operation.",
|
||||
resetTitle : "Reset Search Value"
|
||||
},
|
||||
edit : {
|
||||
addCaption: "Add Record",
|
||||
editCaption: "Edit Record",
|
||||
bSubmit: "Submit",
|
||||
bCancel: "Cancel",
|
||||
bClose: "Close",
|
||||
saveData: "Data has been changed! Save changes?",
|
||||
bYes : "Yes",
|
||||
bNo : "No",
|
||||
bExit : "Cancel",
|
||||
msg: {
|
||||
required:"Field is required",
|
||||
number:"Please, enter valid number",
|
||||
minValue:"value must be greater than or equal to ",
|
||||
maxValue:"value must be less than or equal to",
|
||||
email: "is not a valid e-mail",
|
||||
integer: "Please, enter valid integer value",
|
||||
date: "Please, enter valid date value",
|
||||
url: "is not a valid URL. Prefix required ('http://' or 'https://')",
|
||||
nodefined : " is not defined!",
|
||||
novalue : " return value is required!",
|
||||
customarray : "Custom function should return array!",
|
||||
customfcheck : "Custom function should be present in case of custom checking!"
|
||||
|
||||
}
|
||||
},
|
||||
view : {
|
||||
caption: "View Record",
|
||||
bClose: "Close"
|
||||
},
|
||||
del : {
|
||||
caption: "Delete",
|
||||
msg: "Delete selected record(s)?",
|
||||
bSubmit: "Delete",
|
||||
bCancel: "Cancel"
|
||||
},
|
||||
nav : {
|
||||
edittext: "",
|
||||
edittitle: "Edit selected row",
|
||||
addtext:"",
|
||||
addtitle: "Add new row",
|
||||
deltext: "",
|
||||
deltitle: "Delete selected row",
|
||||
searchtext: "",
|
||||
searchtitle: "Find records",
|
||||
refreshtext: "",
|
||||
refreshtitle: "Reload Grid",
|
||||
alertcap: "Warning",
|
||||
alerttext: "Please, select row",
|
||||
viewtext: "",
|
||||
viewtitle: "View selected row"
|
||||
},
|
||||
col : {
|
||||
all: "Check all",
|
||||
caption: "Select columns",
|
||||
bSubmit: "Ok",
|
||||
bCancel: "Cancel"
|
||||
},
|
||||
errors : {
|
||||
errcap : "Error",
|
||||
nourl : "No url is set",
|
||||
norecords: "No records to process",
|
||||
model : "Length of colNames <> colModel!"
|
||||
},
|
||||
formatter : {
|
||||
integer : {thousandsSeparator: ",", defaultValue: '0'},
|
||||
number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'},
|
||||
currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
|
||||
date : {
|
||||
dayNames: [
|
||||
"Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat",
|
||||
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
|
||||
],
|
||||
monthNames: [
|
||||
"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
|
||||
"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
|
||||
],
|
||||
AmPm : ["am","pm","AM","PM"],
|
||||
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
|
||||
srcformat: 'Y-m-d',
|
||||
newformat: 'n/j/Y',
|
||||
parseRe : /[#%\\\/:_;.,\t\s-]/,
|
||||
masks : {
|
||||
// see http://php.net/manual/en/function.date.php for PHP format used in jqGrid
|
||||
// and see http://docs.jquery.com/UI/Datepicker/formatDate
|
||||
// and https://github.com/jquery/globalize#dates for alternative formats used frequently
|
||||
// one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many
|
||||
// information about date, time, numbers and currency formats used in different countries
|
||||
// one should just convert the information in PHP format
|
||||
ISO8601Long:"Y-m-d H:i:s",
|
||||
ISO8601Short:"Y-m-d",
|
||||
// short date:
|
||||
// n - Numeric representation of a month, without leading zeros
|
||||
// j - Day of the month without leading zeros
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
// example: 3/1/2012 which means 1 March 2012
|
||||
ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy"
|
||||
// long date:
|
||||
// l - A full textual representation of the day of the week
|
||||
// F - A full textual representation of a month
|
||||
// d - Day of the month, 2 digits with leading zeros
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy"
|
||||
// long date with long time:
|
||||
// l - A full textual representation of the day of the week
|
||||
// F - A full textual representation of a month
|
||||
// d - Day of the month, 2 digits with leading zeros
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
// g - 12-hour format of an hour without leading zeros
|
||||
// i - Minutes with leading zeros
|
||||
// s - Seconds, with leading zeros
|
||||
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
|
||||
FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt"
|
||||
// month day:
|
||||
// F - A full textual representation of a month
|
||||
// d - Day of the month, 2 digits with leading zeros
|
||||
MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd"
|
||||
// short time (without seconds)
|
||||
// g - 12-hour format of an hour without leading zeros
|
||||
// i - Minutes with leading zeros
|
||||
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
|
||||
ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt"
|
||||
// long time (with seconds)
|
||||
// g - 12-hour format of an hour without leading zeros
|
||||
// i - Minutes with leading zeros
|
||||
// s - Seconds, with leading zeros
|
||||
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
|
||||
LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt"
|
||||
SortableDateTime: "Y-m-d\\TH:i:s",
|
||||
UniversalSortableDateTime: "Y-m-d H:i:sO",
|
||||
// month with year
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
// F - A full textual representation of a month
|
||||
YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy"
|
||||
},
|
||||
reformatAfterEdit : false,
|
||||
userLocalTime : false
|
||||
},
|
||||
baseLinkUrl: '',
|
||||
showAction: '',
|
||||
target: '',
|
||||
checkbox : {disabled:true},
|
||||
idName : 'id'
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,142 @@
|
||||
;(function($){
|
||||
/**
|
||||
* jqGrid Japanese Translation
|
||||
* OKADA Yoshitada okada.dev@sth.jp
|
||||
* http://trirand.com/blog/
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
**/
|
||||
$.jgrid = $.jgrid || {};
|
||||
$.extend($.jgrid,{
|
||||
extend : {
|
||||
btnSearch: '検索',
|
||||
btnHideSearch: '隠匿',
|
||||
expandTooMany: '今回は“{0}”のノードを展開しなければならない。展開ノードが多すぎるため、キャンセルが実行される。',
|
||||
pageTitle: '数字をクリックすると、ページ番号とページ数を入力して、リターンカーを押して有効になります。!',
|
||||
// pageLabelA: '現在の',
|
||||
// pageLabelB: 'ページは,各ページ',
|
||||
// pageLabelC: '枚,全部 で{0} つ',
|
||||
pageLabelA: '計 {0}',
|
||||
pageLabelB: '',
|
||||
pageLabelC: 'ページ',
|
||||
pageLabelD: 'へ行き'
|
||||
},
|
||||
defaults : {
|
||||
recordtext: "View {0} - {1} of {2}",
|
||||
emptyrecords: "No records to view",
|
||||
loadtext: "\u8aad\u307f\u8fbc\u307f\u4e2d...",
|
||||
pgtext : "Page {0} of {1}"
|
||||
},
|
||||
search : {
|
||||
caption: "\u691c\u7d22...",
|
||||
Find: "\u691c\u7d22",
|
||||
Reset: "\u30ea\u30bb\u30c3\u30c8",
|
||||
odata : ['equal', 'not equal', 'less', 'less or equal','greater','greater or equal', 'begins with','does not begin with','is in','is not in','ends with','does not end with','contains','does not contain'],
|
||||
groupOps: [ { op: "AND", text: "all" }, { op: "OR", text: "any" } ],
|
||||
matchText: " match",
|
||||
rulesText: " rules"
|
||||
},
|
||||
edit : {
|
||||
addCaption: "\u30ec\u30b3\u30fc\u30c9\u8ffd\u52a0",
|
||||
editCaption: "\u30ec\u30b3\u30fc\u30c9\u7de8\u96c6",
|
||||
bSubmit: "\u9001\u4fe1",
|
||||
bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb",
|
||||
bClose: "\u9589\u3058\u308b",
|
||||
saveData: "Data has been changed! Save changes?",
|
||||
bYes : "Yes",
|
||||
bNo : "No",
|
||||
bExit : "Cancel",
|
||||
msg: {
|
||||
required:"\u3053\u306e\u9805\u76ee\u306f\u5fc5\u9808\u3067\u3059\u3002",
|
||||
number:"\u6b63\u3057\u3044\u6570\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
|
||||
minValue:"\u6b21\u306e\u5024\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
|
||||
maxValue:"\u6b21\u306e\u5024\u4ee5\u4e0b\u3067\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
|
||||
email: "e-mail\u304c\u6b63\u3057\u304f\u3042\u308a\u307e\u305b\u3093\u3002",
|
||||
integer: "\u6b63\u3057\u3044\u6574\u6570\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
|
||||
date: "\u6b63\u3057\u3044\u5024\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044\u3002",
|
||||
url: "is not a valid URL. Prefix required ('http://' or 'https://')",
|
||||
nodefined : " is not defined!",
|
||||
novalue : " return value is required!",
|
||||
customarray : "Custom function should return array!",
|
||||
customfcheck : "Custom function should be present in case of custom checking!"
|
||||
}
|
||||
},
|
||||
view : {
|
||||
caption: "View Record",
|
||||
bClose: "Close"
|
||||
},
|
||||
del : {
|
||||
caption: "\u524a\u9664",
|
||||
msg: "\u9078\u629e\u3057\u305f\u30ec\u30b3\u30fc\u30c9\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f",
|
||||
bSubmit: "\u524a\u9664",
|
||||
bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb"
|
||||
},
|
||||
nav : {
|
||||
edittext: " ",
|
||||
edittitle: "\u9078\u629e\u3057\u305f\u884c\u3092\u7de8\u96c6",
|
||||
addtext:" ",
|
||||
addtitle: "\u884c\u3092\u65b0\u898f\u8ffd\u52a0",
|
||||
deltext: " ",
|
||||
deltitle: "\u9078\u629e\u3057\u305f\u884c\u3092\u524a\u9664",
|
||||
searchtext: " ",
|
||||
searchtitle: "\u30ec\u30b3\u30fc\u30c9\u691c\u7d22",
|
||||
refreshtext: "",
|
||||
refreshtitle: "\u30b0\u30ea\u30c3\u30c9\u3092\u30ea\u30ed\u30fc\u30c9",
|
||||
alertcap: "\u8b66\u544a",
|
||||
alerttext: "\u884c\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002",
|
||||
viewtext: "",
|
||||
viewtitle: "View selected row"
|
||||
},
|
||||
col : {
|
||||
all: "全テーマ",
|
||||
caption: "\u5217\u3092\u8868\u793a\uff0f\u96a0\u3059",
|
||||
bSubmit: "\u9001\u4fe1",
|
||||
bCancel: "\u30ad\u30e3\u30f3\u30bb\u30eb"
|
||||
},
|
||||
errors : {
|
||||
errcap : "\u30a8\u30e9\u30fc",
|
||||
nourl : "URL\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002",
|
||||
norecords: "\u51e6\u7406\u5bfe\u8c61\u306e\u30ec\u30b3\u30fc\u30c9\u304c\u3042\u308a\u307e\u305b\u3093\u3002",
|
||||
model : "colNames\u306e\u9577\u3055\u304ccolModel\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002"
|
||||
},
|
||||
formatter : {
|
||||
integer : {thousandsSeparator: " ", defaultValue: '0'},
|
||||
number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'},
|
||||
currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
|
||||
date : {
|
||||
dayNames: [
|
||||
"\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f",
|
||||
"\u65e5", "\u6708", "\u706b", "\u6c34", "\u6728", "\u91d1", "\u571f"
|
||||
],
|
||||
monthNames: [
|
||||
"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12",
|
||||
"1\u6708", "2\u6708", "3\u6708", "4\u6708", "5\u6708", "6\u6708", "7\u6708", "8\u6708", "9\u6708", "10\u6708", "11\u6708", "12\u6708"
|
||||
],
|
||||
AmPm : ["am","pm","AM","PM"],
|
||||
S: "\u756a\u76ee",
|
||||
srcformat: 'Y-m-d',
|
||||
newformat: 'd/m/Y',
|
||||
masks : {
|
||||
ISO8601Long:"Y-m-d H:i:s",
|
||||
ISO8601Short:"Y-m-d",
|
||||
ShortDate: "n/j/Y",
|
||||
LongDate: "l, F d, Y",
|
||||
FullDateTime: "l, F d, Y g:i:s A",
|
||||
MonthDay: "F d",
|
||||
ShortTime: "g:i A",
|
||||
LongTime: "g:i:s A",
|
||||
SortableDateTime: "Y-m-d\\TH:i:s",
|
||||
UniversalSortableDateTime: "Y-m-d H:i:sO",
|
||||
YearMonth: "F, Y"
|
||||
},
|
||||
reformatAfterEdit : false
|
||||
},
|
||||
baseLinkUrl: '',
|
||||
showAction: '',
|
||||
target: '',
|
||||
checkbox : {disabled:true},
|
||||
idName : 'id'
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,190 @@
|
||||
;(function($){
|
||||
/**
|
||||
* jqGrid Chinese Translation
|
||||
* 咖啡兔 yanhonglei@gmail.com
|
||||
* http://www.kafeitu.me
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
**/
|
||||
$.jgrid = $.jgrid || {};
|
||||
$.extend($.jgrid,{
|
||||
extend : {
|
||||
btnSearch: '查询',
|
||||
btnHideSearch: '隐藏',
|
||||
expandTooMany: '本次需要展开“{0}”个节点,因为展开节点过多,执行取消。',
|
||||
pageTitle: '点击数字,可填写页码和每页条数,按回车即可生效!',
|
||||
// pageLabelA: '当前',
|
||||
// pageLabelB: '页,每页',
|
||||
// pageLabelC: '条,共 {0} 条',
|
||||
pageLabelA: '共 {0} 条数据',
|
||||
pageLabelB: '每页',
|
||||
pageLabelC: '条,跳至',
|
||||
pageLabelD: '页'
|
||||
},
|
||||
defaults : {
|
||||
recordtext: "{0} - {1}\u3000共 {2} 条", // 共字前是全角空格
|
||||
emptyrecords: "无数据显示",
|
||||
loadtext: "正在加载...",
|
||||
pgtext : " {0} 共 {1} 页",
|
||||
pgfirst : "第一页",
|
||||
pglast : "最后一页",
|
||||
pgnext : "下一页",
|
||||
pgprev : "上一页",
|
||||
pgrecs : "每页记录数",
|
||||
showhide: "切换 展开 折叠 表格",
|
||||
},
|
||||
search : {
|
||||
caption: "搜索...",
|
||||
Find: "查找",
|
||||
Reset: "重置",
|
||||
odata: [{ oper:'eq', text:'等于\u3000\u3000'},{ oper:'ne', text:'不等于\u3000'},{ oper:'lt', text:'小于\u3000\u3000'},{ oper:'le', text:'小于等于'},{ oper:'gt', text:'大于\u3000\u3000'},{ oper:'ge', text:'大于等于'},{ oper:'bw', text:'开始于'},{ oper:'bn', text:'不开始于'},{ oper:'in', text:'属于\u3000\u3000'},{ oper:'ni', text:'不属于'},{ oper:'ew', text:'结束于'},{ oper:'en', text:'不结束于'},{ oper:'cn', text:'包含\u3000\u3000'},{ oper:'nc', text:'不包含'},{ oper:'nu', text:'不存在'},{ oper:'nn', text:'存在'}],
|
||||
groupOps: [ { op: "AND", text: "满足所有条件" }, { op: "OR", text: "满足任一条件" } ],
|
||||
operandTitle : "单击进行搜索。",
|
||||
resetTitle : "重置搜索条件"
|
||||
},
|
||||
edit : {
|
||||
addCaption: "添加记录",
|
||||
editCaption: "编辑记录",
|
||||
bSubmit: "提交",
|
||||
bCancel: "取消",
|
||||
bClose: "关闭",
|
||||
saveData: "数据已修改,是否保存?",
|
||||
bYes : "是",
|
||||
bNo : "否",
|
||||
bExit : "取消",
|
||||
msg: {
|
||||
required:"此字段必需",
|
||||
number:"请输入有效数字",
|
||||
minValue:"输值必须大于等于 ",
|
||||
maxValue:"输值必须小于等于 ",
|
||||
email: "这不是有效的e-mail地址",
|
||||
integer: "请输入有效整数",
|
||||
date: "请输入有效时间",
|
||||
url: "无效网址。前缀必须为 ('http://' 或 'https://')",
|
||||
nodefined : " 未定义!",
|
||||
novalue : " 需要返回值!",
|
||||
customarray : "自定义函数需要返回数组!",
|
||||
customfcheck : "必须有自定义函数!"
|
||||
}
|
||||
},
|
||||
view : {
|
||||
caption: "查看记录",
|
||||
bClose: "关闭"
|
||||
},
|
||||
del : {
|
||||
caption: "删除",
|
||||
msg: "删除所选记录?",
|
||||
bSubmit: "删除",
|
||||
bCancel: "取消"
|
||||
},
|
||||
nav : {
|
||||
edittext: "",
|
||||
edittitle: "编辑所选记录",
|
||||
addtext:"",
|
||||
addtitle: "添加新记录",
|
||||
deltext: "",
|
||||
deltitle: "删除所选记录",
|
||||
searchtext: "",
|
||||
searchtitle: "查找",
|
||||
refreshtext: "",
|
||||
refreshtitle: "刷新表格",
|
||||
alertcap: "注意",
|
||||
alerttext: "请选择记录",
|
||||
viewtext: "",
|
||||
viewtitle: "查看所选记录"
|
||||
},
|
||||
col : {
|
||||
all: "全选",
|
||||
caption: "选择列",
|
||||
bSubmit: "确定",
|
||||
bCancel: "取消"
|
||||
},
|
||||
errors : {
|
||||
errcap : "错误",
|
||||
nourl : "没有设置url",
|
||||
norecords: "没有需要处理的记录",
|
||||
model : "colNames 和 colModel 长度不等!"
|
||||
},
|
||||
formatter : {
|
||||
integer : {thousandsSeparator: ",", defaultValue: '0'},
|
||||
number : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, defaultValue: '0.00'},
|
||||
currency : {decimalSeparator:".", thousandsSeparator: ",", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
|
||||
date : {
|
||||
dayNames: [
|
||||
"日", "一", "二", "三", "四", "五", "六",
|
||||
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六",
|
||||
],
|
||||
monthNames: [
|
||||
"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二",
|
||||
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
|
||||
],
|
||||
AmPm : ["am","pm","上午","下午"],
|
||||
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
|
||||
srcformat: 'Y-m-d',
|
||||
newformat: 'Y-m-d',
|
||||
parseRe : /[#%\\\/:_;.,\t\s-]/,
|
||||
masks : {
|
||||
// see http://php.net/manual/en/function.date.php for PHP format used in jqGrid
|
||||
// and see http://docs.jquery.com/UI/Datepicker/formatDate
|
||||
// and https://github.com/jquery/globalize#dates for alternative formats used frequently
|
||||
// one can find on https://github.com/jquery/globalize/tree/master/lib/cultures many
|
||||
// information about date, time, numbers and currency formats used in different countries
|
||||
// one should just convert the information in PHP format
|
||||
ISO8601Long:"Y-m-d H:i:s",
|
||||
ISO8601Short:"Y-m-d",
|
||||
// short date:
|
||||
// n - Numeric representation of a month, without leading zeros
|
||||
// j - Day of the month without leading zeros
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
// example: 3/1/2012 which means 1 March 2012
|
||||
ShortDate: "n/j/Y", // in jQuery UI Datepicker: "M/d/yyyy"
|
||||
// long date:
|
||||
// l - A full textual representation of the day of the week
|
||||
// F - A full textual representation of a month
|
||||
// d - Day of the month, 2 digits with leading zeros
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
LongDate: "l, F d, Y", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy"
|
||||
// long date with long time:
|
||||
// l - A full textual representation of the day of the week
|
||||
// F - A full textual representation of a month
|
||||
// d - Day of the month, 2 digits with leading zeros
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
// g - 12-hour format of an hour without leading zeros
|
||||
// i - Minutes with leading zeros
|
||||
// s - Seconds, with leading zeros
|
||||
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
|
||||
FullDateTime: "l, F d, Y g:i:s A", // in jQuery UI Datepicker: "dddd, MMMM dd, yyyy h:mm:ss tt"
|
||||
// month day:
|
||||
// F - A full textual representation of a month
|
||||
// d - Day of the month, 2 digits with leading zeros
|
||||
MonthDay: "F d", // in jQuery UI Datepicker: "MMMM dd"
|
||||
// short time (without seconds)
|
||||
// g - 12-hour format of an hour without leading zeros
|
||||
// i - Minutes with leading zeros
|
||||
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
|
||||
ShortTime: "g:i A", // in jQuery UI Datepicker: "h:mm tt"
|
||||
// long time (with seconds)
|
||||
// g - 12-hour format of an hour without leading zeros
|
||||
// i - Minutes with leading zeros
|
||||
// s - Seconds, with leading zeros
|
||||
// A - Uppercase Ante meridiem and Post meridiem (AM or PM)
|
||||
LongTime: "g:i:s A", // in jQuery UI Datepicker: "h:mm:ss tt"
|
||||
SortableDateTime: "Y-m-d\\TH:i:s",
|
||||
UniversalSortableDateTime: "Y-m-d H:i:sO",
|
||||
// month with year
|
||||
// Y - A full numeric representation of a year, 4 digits
|
||||
// F - A full textual representation of a month
|
||||
YearMonth: "F, Y" // in jQuery UI Datepicker: "MMMM, yyyy"
|
||||
},
|
||||
reformatAfterEdit : false,
|
||||
userLocalTime : false
|
||||
},
|
||||
baseLinkUrl: '',
|
||||
showAction: '',
|
||||
target: '',
|
||||
checkbox : {disabled:true},
|
||||
idName : 'id'
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,152 @@
|
||||
;(function($){
|
||||
/**
|
||||
* jqGrid Chinese (Taiwan) Translation for v4.2
|
||||
* linquize
|
||||
* https://github.com/linquize/jqGrid
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
**/
|
||||
$.jgrid = $.jgrid || {};
|
||||
$.extend($.jgrid,{
|
||||
extend : {
|
||||
btnSearch: '查詢',
|
||||
btnHideSearch: '隱藏',
|
||||
expandTooMany: '本次需要展開“{0}”個節點,因爲展開節點過多,執行取消。',
|
||||
pageTitle: '點擊數字,可填寫頁碼和每頁條數,按回車即可生效!',
|
||||
// pageLabelA: '當前',
|
||||
// pageLabelB: '頁,每頁',
|
||||
// pageLabelC: '條,共 {0} 條',
|
||||
pageLabelA: '共 {0} 條數據',
|
||||
pageLabelB: '每頁',
|
||||
pageLabelC: '條,跳至',
|
||||
pageLabelD: '頁'
|
||||
},
|
||||
defaults : {
|
||||
recordtext: "{0} - {1} 共 {2} 條",
|
||||
emptyrecords: "沒有記錄",
|
||||
loadtext: "載入中...",
|
||||
pgtext : " {0} 共 {1} 頁",
|
||||
pgfirst : "First Page",
|
||||
pglast : "Last Page",
|
||||
pgnext : "Next Page",
|
||||
pgprev : "Previous Page",
|
||||
pgrecs : "Records per Page",
|
||||
showhide: "Toggle Expand Collapse Grid"
|
||||
},
|
||||
search : {
|
||||
caption: "搜尋...",
|
||||
Find: "搜尋",
|
||||
Reset: "重設",
|
||||
odata: [{ oper:'eq', text:"等於 "},{ oper:'ne', text:"不等於 "},{ oper:'lt', text:"小於 "},{ oper:'le', text:"小於等於 "},{ oper:'gt', text:"大於 "},{ oper:'ge', text:"大於等於 "},{ oper:'bw', text:"開始於 "},{ oper:'bn', text:"不開始於 "},{ oper:'in', text:"在其中 "},{ oper:'ni', text:"不在其中 "},{ oper:'ew', text:"結束於 "},{ oper:'en', text:"不結束於 "},{ oper:'cn', text:"包含 "},{ oper:'nc', text:"不包含 "},{ oper:'nu', text:'is null'},{ oper:'nn', text:'is not null'}],
|
||||
groupOps: [ { op: "AND", text: "所有" }, { op: "OR", text: "任一" } ],
|
||||
operandTitle : "Click to select search operation.",
|
||||
resetTitle : "Reset Search Value"
|
||||
},
|
||||
edit : {
|
||||
addCaption: "新增記錄",
|
||||
editCaption: "編輯記錄",
|
||||
bSubmit: "提交",
|
||||
bCancel: "取消",
|
||||
bClose: "關閉",
|
||||
saveData: "資料已改變,是否儲存?",
|
||||
bYes : "是",
|
||||
bNo : "否",
|
||||
bExit : "取消",
|
||||
msg: {
|
||||
required:"此欄必要",
|
||||
number:"請輸入有效的數字",
|
||||
minValue:"值必須大於等於 ",
|
||||
maxValue:"值必須小於等於 ",
|
||||
email: "不是有效的e-mail地址",
|
||||
integer: "請輸入有效整数",
|
||||
date: "請輸入有效時間",
|
||||
url: "網址無效。前綴必須為 ('http://' 或 'https://')",
|
||||
nodefined : " 未定義!",
|
||||
novalue : " 需要傳回值!",
|
||||
customarray : "自訂函數應傳回陣列!",
|
||||
customfcheck : "自訂檢查應有自訂函數!"
|
||||
|
||||
}
|
||||
},
|
||||
view : {
|
||||
caption: "查看記錄",
|
||||
bClose: "關閉"
|
||||
},
|
||||
del : {
|
||||
caption: "刪除",
|
||||
msg: "刪除已選記錄?",
|
||||
bSubmit: "刪除",
|
||||
bCancel: "取消"
|
||||
},
|
||||
nav : {
|
||||
edittext: "",
|
||||
edittitle: "編輯已選列",
|
||||
addtext:"",
|
||||
addtitle: "新增列",
|
||||
deltext: "",
|
||||
deltitle: "刪除已選列",
|
||||
searchtext: "",
|
||||
searchtitle: "搜尋記錄",
|
||||
refreshtext: "",
|
||||
refreshtitle: "重新整理表格",
|
||||
alertcap: "警告",
|
||||
alerttext: "請選擇列",
|
||||
viewtext: "",
|
||||
viewtitle: "檢視已選列"
|
||||
},
|
||||
col : {
|
||||
all: "全選",
|
||||
caption: "選擇欄",
|
||||
bSubmit: "確定",
|
||||
bCancel: "取消"
|
||||
},
|
||||
errors : {
|
||||
errcap : "錯誤",
|
||||
nourl : "未設定URL",
|
||||
norecords: "無需要處理的記錄",
|
||||
model : "colNames 和 colModel 長度不同!"
|
||||
},
|
||||
formatter : {
|
||||
integer : {thousandsSeparator: " ", defaultValue: '0'},
|
||||
number : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, defaultValue: '0.00'},
|
||||
currency : {decimalSeparator:".", thousandsSeparator: " ", decimalPlaces: 2, prefix: "", suffix:"", defaultValue: '0.00'},
|
||||
date : {
|
||||
dayNames: [
|
||||
"日", "一", "二", "三", "四", "五", "六",
|
||||
"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"
|
||||
],
|
||||
monthNames: [
|
||||
"一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二",
|
||||
"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"
|
||||
],
|
||||
AmPm : ["上午","下午","上午","下午"],
|
||||
S: function (j) {return j < 11 || j > 13 ? ['st', 'nd', 'rd', 'th'][Math.min((j - 1) % 10, 3)] : 'th';},
|
||||
srcformat: 'Y-m-d',
|
||||
newformat: 'm-d-Y',
|
||||
parseRe : /[#%\\\/:_;.,\t\s-]/,
|
||||
masks : {
|
||||
ISO8601Long:"Y-m-d H:i:s",
|
||||
ISO8601Short:"Y-m-d",
|
||||
ShortDate: "Y/j/n",
|
||||
LongDate: "l, F d, Y",
|
||||
FullDateTime: "l, F d, Y g:i:s A",
|
||||
MonthDay: "F d",
|
||||
ShortTime: "g:i A",
|
||||
LongTime: "g:i:s A",
|
||||
SortableDateTime: "Y-m-d\\TH:i:s",
|
||||
UniversalSortableDateTime: "Y-m-d H:i:sO",
|
||||
YearMonth: "F, Y"
|
||||
},
|
||||
reformatAfterEdit : false,
|
||||
userLocalTime : false
|
||||
},
|
||||
baseLinkUrl: '',
|
||||
showAction: '',
|
||||
target: '',
|
||||
checkbox : {disabled:true},
|
||||
idName : 'id'
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
13119
modules/static/src/main/resources/static/jqGrid/4.7/js/jquery.jqGrid.js
Normal file
13119
modules/static/src/main/resources/static/jqGrid/4.7/js/jquery.jqGrid.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,704 @@
|
||||
(function($){
|
||||
/*
|
||||
* jqGrid methods without support. Use as you wish
|
||||
* Tony Tomov tony@trirand.com
|
||||
* http://trirand.com/blog/
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html
|
||||
*
|
||||
* This list of deprecated methods.
|
||||
* If you instead want to use them, please include this file after the grid main file.
|
||||
* Some methods will be then overwritten.
|
||||
*
|
||||
*/
|
||||
/*global jQuery, $ */
|
||||
|
||||
$.jgrid.extend({
|
||||
// This is the ols search Filter method used in navigator.
|
||||
searchGrid : function (p) {
|
||||
p = $.extend({
|
||||
recreateFilter: false,
|
||||
drag: true,
|
||||
sField:'searchField',
|
||||
sValue:'searchString',
|
||||
sOper: 'searchOper',
|
||||
sFilter: 'filters',
|
||||
loadDefaults: true, // this options activates loading of default filters from grid's postData for Multipe Search only.
|
||||
beforeShowSearch: null,
|
||||
afterShowSearch : null,
|
||||
onInitializeSearch: null,
|
||||
closeAfterSearch : false,
|
||||
closeAfterReset: false,
|
||||
closeOnEscape : false,
|
||||
multipleSearch : false,
|
||||
cloneSearchRowOnAdd: true,
|
||||
// translation
|
||||
// if you want to change or remove the order change it in sopt
|
||||
// ['bw','eq','ne','lt','le','gt','ge','ew','cn']
|
||||
sopt: null,
|
||||
// Note: stringResult is intentionally declared "undefined by default".
|
||||
// you are velcome to define stringResult expressly in the options you pass to searchGrid()
|
||||
// stringResult is a "safeguard" measure to insure we post sensible data when communicated as form-encoded
|
||||
// see http://github.com/tonytomov/jqGrid/issues/#issue/36
|
||||
//
|
||||
// If this value is not expressly defined in the incoming options,
|
||||
// lower in the code we will infer the value based on value of multipleSearch
|
||||
stringResult: undefined,
|
||||
onClose : null,
|
||||
// useDataProxy allows ADD, EDIT and DEL code to bypass calling $.ajax
|
||||
// directly when grid's 'dataProxy' property (grid.p.dataProxy) is a function.
|
||||
// Used for "editGridRow" and "delGridRow" below and automatically flipped to TRUE
|
||||
// when ajax setting's 'url' (grid's 'editurl') property is undefined.
|
||||
// When 'useDataProxy' is true, instead of calling $.ajax.call(gridDOMobj, o, i) we call
|
||||
// gridDOMobj.p.dataProxy.call(gridDOMobj, o, i)
|
||||
//
|
||||
// Behavior is extremely similar to when 'datatype' is a function, but arguments are slightly different.
|
||||
// Normally the following is fed to datatype.call(a, b, c):
|
||||
// a = Pointer to grid's table DOM element, b = grid.p.postdata, c = "load_"+grid's ID
|
||||
// In cases of "edit" and "del" the following is fed:
|
||||
// a = Pointer to grid's table DOM element (same),
|
||||
// b = extended Ajax Options including postdata in "data" property. (different object type)
|
||||
// c = "set_"+grid's ID in case of "edit" and "del_"+grid's ID in case of "del" (same type, different content)
|
||||
// The major difference is that complete ajax options object, with attached "complete" and "error"
|
||||
// callback functions is fed instead of only post data.
|
||||
// This allows you to emulate a $.ajax call (including calling "complete"/"error"),
|
||||
// while retrieving the data locally in the browser.
|
||||
useDataProxy: false,
|
||||
overlay : true
|
||||
}, $.jgrid.search, p || {});
|
||||
return this.each(function() {
|
||||
var $t = this;
|
||||
if(!$t.grid) {return;}
|
||||
var fid = "fbox_"+$t.p.id,
|
||||
showFrm = true;
|
||||
function applyDefaultFilters(gridDOMobj, filterSettings) {
|
||||
/*
|
||||
gridDOMobj = ointer to grid DOM object ( $(#list)[0] )
|
||||
What we need from gridDOMobj:
|
||||
gridDOMobj.SearchFilter is the pointer to the Search box, once it's created.
|
||||
gridDOMobj.p.postData - dictionary of post settings. These can be overriden at grid creation to
|
||||
contain default filter settings. We will parse these and will populate the search with defaults.
|
||||
filterSettings - same settings object you (would) pass to $().jqGrid('searchGrid', filterSettings);
|
||||
*/
|
||||
|
||||
// Pulling default filter settings out of postData property of grid's properties.:
|
||||
var defaultFilters = gridDOMobj.p.postData[filterSettings.sFilter];
|
||||
// example of what we might get: {"groupOp":"and","rules":[{"field":"amount","op":"eq","data":"100"}]}
|
||||
// suppose we have imported this with grid import, the this is a string.
|
||||
if(typeof(defaultFilters) == "string") {
|
||||
defaultFilters = $.jgrid.parse(defaultFilters);
|
||||
}
|
||||
if (defaultFilters) {
|
||||
if (defaultFilters.groupOp) {
|
||||
gridDOMobj.SearchFilter.setGroupOp(defaultFilters.groupOp);
|
||||
}
|
||||
if (defaultFilters.rules) {
|
||||
var f, i = 0, li = defaultFilters.rules.length, success = false;
|
||||
for (; i < li; i++) {
|
||||
f = defaultFilters.rules[i];
|
||||
// we are not trying to counter all issues with filter declaration here. Just the basics to avoid lookup exceptions.
|
||||
if (f.field !== undefined && f.op !== undefined && f.data !== undefined) {
|
||||
success = gridDOMobj.SearchFilter.setFilter({
|
||||
'sfref':gridDOMobj.SearchFilter.$.find(".sf:last"),
|
||||
'filter':$.extend({},f)
|
||||
});
|
||||
if (success) { gridDOMobj.SearchFilter.add(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // end of applyDefaultFilters
|
||||
function hideFilter(selector) {
|
||||
if(p.onClose){
|
||||
var fclm = p.onClose(selector);
|
||||
if(typeof fclm == 'boolean' && !fclm) { return; }
|
||||
}
|
||||
selector.hide();
|
||||
if(p.overlay === true) {
|
||||
$(".jqgrid-overlay:first","#gbox_"+$t.p.id).hide();
|
||||
}
|
||||
}
|
||||
function showFilter(){
|
||||
var fl = $(".ui-searchFilter").length;
|
||||
if(fl > 1) {
|
||||
var zI = $("#"+fid).css("zIndex");
|
||||
$("#"+fid).css({zIndex:parseInt(zI,10)+fl});
|
||||
}
|
||||
$("#"+fid).show();
|
||||
if(p.overlay === true) {
|
||||
$(".jqgrid-overlay:first","#gbox_"+$t.p.id).show();
|
||||
}
|
||||
try{$(':input:visible',"#"+fid)[0].focus();}catch(_){}
|
||||
}
|
||||
function searchFilters(filters) {
|
||||
var hasFilters = (filters !== undefined),
|
||||
grid = $("#"+$t.p.id),
|
||||
sdata={};
|
||||
if(p.multipleSearch===false) {
|
||||
sdata[p.sField] = filters.rules[0].field;
|
||||
sdata[p.sValue] = filters.rules[0].data;
|
||||
sdata[p.sOper] = filters.rules[0].op;
|
||||
if(sdata.hasOwnProperty(p.sFilter) ) {
|
||||
delete sdata[p.sFilter];
|
||||
}
|
||||
} else {
|
||||
sdata[p.sFilter] = filters;
|
||||
$.each([p.sField, p.sValue, p.sOper], function(i, n){
|
||||
if(sdata.hasOwnProperty(n)) { delete sdata[n];}
|
||||
});
|
||||
}
|
||||
grid[0].p.search = hasFilters;
|
||||
$.extend(grid[0].p.postData,sdata);
|
||||
grid.trigger("reloadGrid",[{page:1}]);
|
||||
if(p.closeAfterSearch) { hideFilter($("#"+fid)); }
|
||||
}
|
||||
function resetFilters(op) {
|
||||
var reload = op && op.hasOwnProperty("reload") ? op.reload : true,
|
||||
grid = $("#"+$t.p.id),
|
||||
sdata={};
|
||||
grid[0].p.search = false;
|
||||
if(p.multipleSearch===false) {
|
||||
sdata[p.sField] = sdata[p.sValue] = sdata[p.sOper] = "";
|
||||
} else {
|
||||
sdata[p.sFilter] = "";
|
||||
}
|
||||
$.extend(grid[0].p.postData,sdata);
|
||||
if(reload) {
|
||||
grid.trigger("reloadGrid",[{page:1}]);
|
||||
}
|
||||
if(p.closeAfterReset) { hideFilter($("#"+fid)); }
|
||||
}
|
||||
if($.fn.searchFilter) {
|
||||
if(p.recreateFilter===true) {$("#"+fid).remove();}
|
||||
if( $("#"+fid).html() != null ) {
|
||||
if ( $.isFunction(p.beforeShowSearch) ) {
|
||||
showFrm = p.beforeShowSearch($("#"+fid));
|
||||
if(typeof(showFrm) == "undefined") {
|
||||
showFrm = true;
|
||||
}
|
||||
}
|
||||
if(showFrm === false) { return; }
|
||||
showFilter();
|
||||
if( $.isFunction(p.afterShowSearch) ) { p.afterShowSearch($("#"+fid)); }
|
||||
} else {
|
||||
var fields = [],
|
||||
colNames = $("#"+$t.p.id).jqGrid("getGridParam","colNames"),
|
||||
colModel = $("#"+$t.p.id).jqGrid("getGridParam","colModel"),
|
||||
stempl = ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'],
|
||||
j,pos,k,oprtr=[];
|
||||
if (p.sopt !==null) {
|
||||
k=0;
|
||||
for(j=0;j<p.sopt.length;j++) {
|
||||
if( (pos= $.inArray(p.sopt[j],stempl)) != -1 ){
|
||||
oprtr[k] = {op:p.sopt[j],text: p.odata[pos].text};
|
||||
k++;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for(j=0;j<stempl.length;j++) {
|
||||
oprtr[j] = {op:stempl[j],text: p.odata[j].text};
|
||||
}
|
||||
}
|
||||
$.each(colModel, function(i, v) {
|
||||
var searchable = (typeof v.search === 'undefined') ? true: v.search ,
|
||||
hidden = (v.hidden === true),
|
||||
soptions = $.extend({}, {text: colNames[i], itemval: v.index || v.name}, this.searchoptions),
|
||||
ignoreHiding = (soptions.searchhidden === true);
|
||||
if(typeof soptions.sopt !== 'undefined') {
|
||||
k=0;
|
||||
soptions.ops =[];
|
||||
if(soptions.sopt.length>0) {
|
||||
for(j=0;j<soptions.sopt.length;j++) {
|
||||
if( (pos= $.inArray(soptions.sopt[j],stempl)) != -1 ){
|
||||
soptions.ops[k] = {op:soptions.sopt[j],text: p.odata[pos].text};
|
||||
k++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(typeof(this.stype) === 'undefined') { this.stype='text'; }
|
||||
if(this.stype == 'select') {
|
||||
if ( soptions.dataUrl !== undefined) {}
|
||||
else {
|
||||
var eov;
|
||||
if(soptions.value) {
|
||||
eov = soptions.value;
|
||||
} else if(this.editoptions) {
|
||||
eov = this.editoptions.value;
|
||||
}
|
||||
if(eov) {
|
||||
soptions.dataValues =[];
|
||||
if(typeof(eov) === 'string') {
|
||||
var so = eov.split(";"),sv;
|
||||
for(j=0;j<so.length;j++) {
|
||||
sv = so[j].split(":");
|
||||
soptions.dataValues[j] ={value:sv[0],text:sv[1]};
|
||||
}
|
||||
} else if (typeof(eov) === 'object') {
|
||||
j=0;
|
||||
for (var key in eov) {
|
||||
if(eov.hasOwnProperty(key)) {
|
||||
soptions.dataValues[j] ={value:key,text:eov[key]};
|
||||
j++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((ignoreHiding && searchable) || (searchable && !hidden)) {
|
||||
fields.push(soptions);
|
||||
}
|
||||
});
|
||||
if(fields.length>0){
|
||||
$("<div id='"+fid+"' role='dialog' tabindex='-1'></div>").insertBefore("#gview_"+$t.p.id);
|
||||
// Before we create searchFilter we need to decide if we want to get back a string or a JS object.
|
||||
// see http://github.com/tonytomov/jqGrid/issues/#issue/36 for background on the issue.
|
||||
// If p.stringResult is defined, it was explisitly passed to us by user. Honor the choice, whatever it is.
|
||||
if (p.stringResult===undefined) {
|
||||
// to provide backward compatibility, inferring stringResult value from multipleSearch
|
||||
p.stringResult = p.multipleSearch;
|
||||
}
|
||||
// we preserve the return value here to retain access to .add() and other good methods of search form.
|
||||
$t.SearchFilter = $("#"+fid).searchFilter(fields, { groupOps: p.groupOps, operators: oprtr, onClose:hideFilter, resetText: p.Reset, searchText: p.Find, windowTitle: p.caption, rulesText:p.rulesText, matchText:p.matchText, onSearch: searchFilters, onReset: resetFilters,stringResult:p.stringResult, ajaxSelectOptions: $.extend({},$.jgrid.ajaxOptions,$t.p.ajaxSelectOptions ||{}), clone: p.cloneSearchRowOnAdd });
|
||||
$(".ui-widget-overlay","#"+fid).remove();
|
||||
if($t.p.direction=="rtl") { $(".ui-closer","#"+fid).css("float","left"); }
|
||||
if (p.drag===true) {
|
||||
$("#"+fid+" table thead tr:first td:first").css('cursor','move');
|
||||
if(jQuery.fn.jqDrag) {
|
||||
$("#"+fid).jqDrag($("#"+fid+" table thead tr:first td:first"));
|
||||
} else {
|
||||
try {
|
||||
$("#"+fid).draggable({handle: $("#"+fid+" table thead tr:first td:first")});
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
if(p.multipleSearch === false) {
|
||||
$(".ui-del, .ui-add, .ui-del, .ui-add-last, .matchText, .rulesText", "#"+fid).hide();
|
||||
$("select[name='groupOp']","#"+fid).hide();
|
||||
}
|
||||
if (p.multipleSearch === true && p.loadDefaults === true) {
|
||||
applyDefaultFilters($t, p);
|
||||
}
|
||||
if ( $.isFunction(p.onInitializeSearch) ) { p.onInitializeSearch( $("#"+fid) ); }
|
||||
if ( $.isFunction(p.beforeShowSearch) ) {
|
||||
showFrm = p.beforeShowSearch($("#"+fid));
|
||||
if(typeof(showFrm) == "undefined") {
|
||||
showFrm = true;
|
||||
}
|
||||
}
|
||||
if(showFrm === false) { return; }
|
||||
showFilter();
|
||||
if( $.isFunction(p.afterShowSearch) ) { p.afterShowSearch($("#"+fid)); }
|
||||
if(p.closeOnEscape===true){
|
||||
$("#"+fid).keydown( function( e ) {
|
||||
if( e.which == 27 ) {
|
||||
hideFilter($("#"+fid));
|
||||
}
|
||||
if (e.which == 13) {
|
||||
$(".ui-search", this).click();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
// methods taken from grid.custom.
|
||||
updateGridRows : function (data, rowidname, jsonreader) {
|
||||
var nm, success=false, title;
|
||||
this.each(function(){
|
||||
var t = this, vl, ind, srow, sid;
|
||||
if(!t.grid) {return false;}
|
||||
if(!rowidname) { rowidname = "id"; }
|
||||
if( data && data.length >0 ) {
|
||||
$(data).each(function(j){
|
||||
srow = this;
|
||||
ind = t.rows.namedItem(srow[rowidname]);
|
||||
if(ind) {
|
||||
sid = srow[rowidname];
|
||||
if(jsonreader === true){
|
||||
if(t.p.jsonReader.repeatitems === true) {
|
||||
if(t.p.jsonReader.cell) {srow = srow[t.p.jsonReader.cell];}
|
||||
for (var k=0;k<srow.length;k++) {
|
||||
vl = t.formatter( sid, srow[k], k, srow, 'edit');
|
||||
title = t.p.colModel[k].title ? {"title":$.jgrid.stripHtml(vl)} : {};
|
||||
if(t.p.treeGrid===true && nm == t.p.ExpandColumn) {
|
||||
$("td:eq("+k+") > span:first",ind).html(vl).attr(title);
|
||||
} else {
|
||||
$("td:eq("+k+")",ind).html(vl).attr(title);
|
||||
}
|
||||
}
|
||||
success = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
$(t.p.colModel).each(function(i){
|
||||
nm = jsonreader===true ? this.jsonmap || this.name :this.name;
|
||||
if( srow[nm] !== undefined) {
|
||||
vl = t.formatter( sid, srow[nm], i, srow, 'edit');
|
||||
title = this.title ? {"title":$.jgrid.stripHtml(vl)} : {};
|
||||
if(t.p.treeGrid===true && nm == t.p.ExpandColumn) {
|
||||
$("td:eq("+i+") > span:first",ind).html(vl).attr(title);
|
||||
} else {
|
||||
$("td:eq("+i+")",ind).html(vl).attr(title);
|
||||
}
|
||||
success = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
return success;
|
||||
},
|
||||
// Form search - sorry for this method. Instead use ne jqFilter method.
|
||||
filterGrid : function(gridid,p){
|
||||
p = $.extend({
|
||||
gridModel : false,
|
||||
gridNames : false,
|
||||
gridToolbar : false,
|
||||
filterModel: [], // label/name/stype/defval/surl/sopt
|
||||
formtype : "horizontal", // horizontal/vertical
|
||||
autosearch: true, // if set to false a serch button should be enabled.
|
||||
formclass: "filterform",
|
||||
tableclass: "filtertable",
|
||||
buttonclass: "filterbutton",
|
||||
searchButton: "Search",
|
||||
clearButton: "Clear",
|
||||
enableSearch : false,
|
||||
enableClear: false,
|
||||
beforeSearch: null,
|
||||
afterSearch: null,
|
||||
beforeClear: null,
|
||||
afterClear: null,
|
||||
url : '',
|
||||
marksearched: true
|
||||
},p || {});
|
||||
return this.each(function(){
|
||||
var self = this;
|
||||
this.p = p;
|
||||
if(this.p.filterModel.length === 0 && this.p.gridModel===false) { alert("No filter is set"); return;}
|
||||
if( !gridid) {alert("No target grid is set!"); return;}
|
||||
this.p.gridid = gridid.indexOf("#") != -1 ? gridid : "#"+gridid;
|
||||
var gcolMod = $(this.p.gridid).jqGrid("getGridParam",'colModel');
|
||||
if(gcolMod) {
|
||||
if( this.p.gridModel === true) {
|
||||
var thegrid = $(this.p.gridid)[0];
|
||||
var sh;
|
||||
// we should use the options search, edittype, editoptions
|
||||
// additionally surl and defval can be added in grid colModel
|
||||
$.each(gcolMod, function (i,n) {
|
||||
var tmpFil = [];
|
||||
this.search = this.search === false ? false : true;
|
||||
if(this.editrules && this.editrules.searchhidden === true) {
|
||||
sh = true;
|
||||
} else {
|
||||
if(this.hidden === true ) {
|
||||
sh = false;
|
||||
} else {
|
||||
sh = true;
|
||||
}
|
||||
}
|
||||
if( this.search === true && sh === true) {
|
||||
if(self.p.gridNames===true) {
|
||||
tmpFil.label = thegrid.p.colNames[i];
|
||||
} else {
|
||||
tmpFil.label = '';
|
||||
}
|
||||
tmpFil.name = this.name;
|
||||
tmpFil.index = this.index || this.name;
|
||||
// we support only text and selects, so all other to text
|
||||
tmpFil.stype = this.edittype || 'text';
|
||||
if(tmpFil.stype != 'select' ) {
|
||||
tmpFil.stype = 'text';
|
||||
}
|
||||
tmpFil.defval = this.defval || '';
|
||||
tmpFil.surl = this.surl || '';
|
||||
tmpFil.sopt = this.editoptions || {};
|
||||
tmpFil.width = this.width;
|
||||
self.p.filterModel.push(tmpFil);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$.each(self.p.filterModel,function(i,n) {
|
||||
for(var j=0;j<gcolMod.length;j++) {
|
||||
if(this.name == gcolMod[j].name) {
|
||||
this.index = gcolMod[j].index || this.name;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!this.index) {
|
||||
this.index = this.name;
|
||||
}
|
||||
});
|
||||
}
|
||||
} else {
|
||||
alert("Could not get grid colModel"); return;
|
||||
}
|
||||
var triggerSearch = function() {
|
||||
var sdata={}, j=0, v;
|
||||
var gr = $(self.p.gridid)[0], nm;
|
||||
gr.p.searchdata = {};
|
||||
if($.isFunction(self.p.beforeSearch)){self.p.beforeSearch();}
|
||||
$.each(self.p.filterModel,function(i,n){
|
||||
nm = this.index;
|
||||
if(this.stype === 'select') {
|
||||
v = $("select[name="+nm+"]",self).val();
|
||||
if(v) {
|
||||
sdata[nm] = v;
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
|
||||
}
|
||||
j++;
|
||||
} else {
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
|
||||
}
|
||||
try {
|
||||
delete gr.p.postData[this.index];
|
||||
} catch (e) {}
|
||||
}
|
||||
} else {
|
||||
v = $("input[name="+nm+"]",self).val();
|
||||
if(v) {
|
||||
sdata[nm] = v;
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
|
||||
}
|
||||
j++;
|
||||
} else {
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
|
||||
}
|
||||
try {
|
||||
delete gr.p.postData[this.index];
|
||||
} catch(x) {}
|
||||
}
|
||||
}
|
||||
});
|
||||
var sd = j>0 ? true : false;
|
||||
$.extend(gr.p.postData,sdata);
|
||||
var saveurl;
|
||||
if(self.p.url) {
|
||||
saveurl = $(gr).jqGrid("getGridParam",'url');
|
||||
$(gr).jqGrid("setGridParam",{url:self.p.url});
|
||||
}
|
||||
$(gr).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]);
|
||||
if(saveurl) {$(gr).jqGrid("setGridParam",{url:saveurl});}
|
||||
if($.isFunction(self.p.afterSearch)){self.p.afterSearch();}
|
||||
};
|
||||
var clearSearch = function(){
|
||||
var sdata={}, v, j=0;
|
||||
var gr = $(self.p.gridid)[0], nm;
|
||||
if($.isFunction(self.p.beforeClear)){self.p.beforeClear();}
|
||||
$.each(self.p.filterModel,function(i,n){
|
||||
nm = this.index;
|
||||
v = (this.defval) ? this.defval : "";
|
||||
if(!this.stype){this.stype='text';}
|
||||
switch (this.stype) {
|
||||
case 'select' :
|
||||
var v1;
|
||||
$("select[name="+nm+"] option",self).each(function (i){
|
||||
if(i===0) { this.selected = true; }
|
||||
if ($(this).text() == v) {
|
||||
this.selected = true;
|
||||
v1 = $(this).val();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if(v1) {
|
||||
// post the key and not the text
|
||||
sdata[nm] = v1;
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
|
||||
}
|
||||
j++;
|
||||
} else {
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
|
||||
}
|
||||
try {
|
||||
delete gr.p.postData[this.index];
|
||||
} catch (e) {}
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
$("input[name="+nm+"]",self).val(v);
|
||||
if(v) {
|
||||
sdata[nm] = v;
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).addClass("dirty-cell");
|
||||
}
|
||||
j++;
|
||||
} else {
|
||||
if(self.p.marksearched){
|
||||
$("#jqgh_"+this.name,gr.grid.hDiv).removeClass("dirty-cell");
|
||||
}
|
||||
try {
|
||||
delete gr.p.postData[this.index];
|
||||
} catch (k) {}
|
||||
}
|
||||
break;
|
||||
}
|
||||
});
|
||||
var sd = j>0 ? true : false;
|
||||
$.extend(gr.p.postData,sdata);
|
||||
var saveurl;
|
||||
if(self.p.url) {
|
||||
saveurl = $(gr).jqGrid("getGridParam",'url');
|
||||
$(gr).jqGrid("setGridParam",{url:self.p.url});
|
||||
}
|
||||
$(gr).jqGrid("setGridParam",{search:sd}).trigger("reloadGrid",[{page:1}]);
|
||||
if(saveurl) {$(gr).jqGrid("setGridParam",{url:saveurl});}
|
||||
if($.isFunction(self.p.afterClear)){self.p.afterClear();}
|
||||
};
|
||||
var tbl;
|
||||
var formFill = function(){
|
||||
var tr = document.createElement("tr");
|
||||
var tr1, sb, cb,tl,td;
|
||||
if(self.p.formtype=='horizontal'){
|
||||
$(tbl).append(tr);
|
||||
}
|
||||
$.each(self.p.filterModel,function(i,n){
|
||||
tl = document.createElement("td");
|
||||
$(tl).append("<label for='"+this.name+"'>"+this.label+"</label>");
|
||||
td = document.createElement("td");
|
||||
var $t=this;
|
||||
if(!this.stype) { this.stype='text';}
|
||||
switch (this.stype)
|
||||
{
|
||||
case "select":
|
||||
if(this.surl) {
|
||||
// data returned should have already constructed html select
|
||||
$(td).load(this.surl,function(){
|
||||
if($t.defval) { $("select",this).val($t.defval); }
|
||||
$("select",this).attr({name:$t.index || $t.name, id: "sg_"+$t.name});
|
||||
if($t.sopt) { $("select",this).attr($t.sopt); }
|
||||
if(self.p.gridToolbar===true && $t.width) {
|
||||
$("select",this).width($t.width);
|
||||
}
|
||||
if(self.p.autosearch===true){
|
||||
$("select",this).change(function(e){
|
||||
triggerSearch();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// sopt to construct the values
|
||||
if($t.sopt.value) {
|
||||
var oSv = $t.sopt.value;
|
||||
var elem = document.createElement("select");
|
||||
$(elem).attr({name:$t.index || $t.name, id: "sg_"+$t.name}).attr($t.sopt);
|
||||
var so, sv, ov;
|
||||
if(typeof oSv === "string") {
|
||||
so = oSv.split(";");
|
||||
for(var k=0; k<so.length;k++){
|
||||
sv = so[k].split(":");
|
||||
ov = document.createElement("option");
|
||||
ov.value = sv[0]; ov.innerHTML = sv[1];
|
||||
if (sv[1]==$t.defval) { ov.selected ="selected"; }
|
||||
elem.appendChild(ov);
|
||||
}
|
||||
} else if(typeof oSv === "object" ) {
|
||||
for ( var key in oSv) {
|
||||
if(oSv.hasOwnProperty(key)) {
|
||||
i++;
|
||||
ov = document.createElement("option");
|
||||
ov.value = key; ov.innerHTML = oSv[key];
|
||||
if (oSv[key]==$t.defval) { ov.selected ="selected"; }
|
||||
elem.appendChild(ov);
|
||||
}
|
||||
}
|
||||
}
|
||||
if(self.p.gridToolbar===true && $t.width) {
|
||||
$(elem).width($t.width);
|
||||
}
|
||||
$(td).append(elem);
|
||||
if(self.p.autosearch===true){
|
||||
$(elem).change(function(e){
|
||||
triggerSearch();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'text':
|
||||
var df = this.defval ? this.defval: "";
|
||||
$(td).append("<input type='text' name='"+(this.index || this.name)+"' id='sg_"+this.name+"' value='"+df+"'/>");
|
||||
if($t.sopt) { $("input",td).attr($t.sopt); }
|
||||
if(self.p.gridToolbar===true && $t.width) {
|
||||
if($.browser.msie) {
|
||||
$("input",td).width($t.width-4);
|
||||
} else {
|
||||
$("input",td).width($t.width-2);
|
||||
}
|
||||
}
|
||||
if(self.p.autosearch===true){
|
||||
$("input",td).keypress(function(e){
|
||||
var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;
|
||||
if(key == 13){
|
||||
triggerSearch();
|
||||
return false;
|
||||
}
|
||||
return this;
|
||||
});
|
||||
}
|
||||
break;
|
||||
}
|
||||
if(self.p.formtype=='horizontal'){
|
||||
if(self.p.gridToolbar===true && self.p.gridNames===false) {
|
||||
$(tr).append(td);
|
||||
} else {
|
||||
$(tr).append(tl).append(td);
|
||||
}
|
||||
$(tr).append(td);
|
||||
} else {
|
||||
tr1 = document.createElement("tr");
|
||||
$(tr1).append(tl).append(td);
|
||||
$(tbl).append(tr1);
|
||||
}
|
||||
});
|
||||
td = document.createElement("td");
|
||||
if(self.p.enableSearch === true){
|
||||
sb = "<input type='button' id='sButton' class='"+self.p.buttonclass+"' value='"+self.p.searchButton+"'/>";
|
||||
$(td).append(sb);
|
||||
$("input#sButton",td).click(function(){
|
||||
triggerSearch();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
if(self.p.enableClear === true) {
|
||||
cb = "<input type='button' id='cButton' class='"+self.p.buttonclass+"' value='"+self.p.clearButton+"'/>";
|
||||
$(td).append(cb);
|
||||
$("input#cButton",td).click(function(){
|
||||
clearSearch();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
if(self.p.enableClear === true || self.p.enableSearch === true) {
|
||||
if(self.p.formtype=='horizontal') {
|
||||
$(tr).append(td);
|
||||
} else {
|
||||
tr1 = document.createElement("tr");
|
||||
$(tr1).append("<td> </td>").append(td);
|
||||
$(tbl).append(tr1);
|
||||
}
|
||||
}
|
||||
};
|
||||
var frm = $("<form name='SearchForm' style=display:inline;' class='"+this.p.formclass+"'></form>");
|
||||
tbl =$("<table class='"+this.p.tableclass+"' cellspacing='0' cellpadding='0' border='0'><tbody></tbody></table>");
|
||||
$(frm).append(tbl);
|
||||
formFill();
|
||||
$(this).append(frm);
|
||||
this.triggerSearch = triggerSearch;
|
||||
this.clearSearch = clearSearch;
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,430 @@
|
||||
/**
|
||||
* jqGrid complexGroupHeaders
|
||||
* name cj
|
||||
* email 85309651@qq.com
|
||||
* blog http://cjblog.iteye.com/
|
||||
* version 0.2
|
||||
* date 2012-06-03
|
||||
**/
|
||||
(function($){
|
||||
$.jgrid.extend({
|
||||
/**
|
||||
* 三级表头 by ljq
|
||||
* @参数 o : 三级表头参数
|
||||
*/
|
||||
setComplexHeaders : function ( o ) {
|
||||
o = $.extend({
|
||||
complexHeaders: {
|
||||
defaultStyle : true,
|
||||
threeLevel:[],
|
||||
twoLevel:[]
|
||||
}
|
||||
}, o || {});
|
||||
return this.each(function(){
|
||||
//三级表头和二级表头
|
||||
var complexHeaders = o.complexHeaders,
|
||||
threeHeaders = complexHeaders["threeLevel"],
|
||||
twoHeaders = complexHeaders["twoLevel"];
|
||||
if (threeHeaders.length === 0 || twoHeaders.length === 0) {
|
||||
return;
|
||||
}
|
||||
this.p.complexHeader = o;
|
||||
var ts = this,
|
||||
defaultStyle = complexHeaders.defaultStyle === undefined ? true : complexHeaders.defaultStyle,
|
||||
i, cmi, $thirdHeaderRow, $fourHeaderRow, $colHeader, th, $th, thStyle,
|
||||
iCol,
|
||||
tempInCol,
|
||||
inThreeCol,
|
||||
inTwoCol,
|
||||
threeLevelSkip = 0,
|
||||
twoLevelSkip = 0,
|
||||
hasTwoLevel = false,
|
||||
cghi,
|
||||
numberOfColumns,
|
||||
titleText,
|
||||
cVisibleColumns,
|
||||
colModel = ts.p.colModel,
|
||||
cml = colModel.length,
|
||||
ths = ts.grid.headers,
|
||||
$htable = $("table.ui-jqgrid-htable", ts.grid.hDiv),
|
||||
$secondHeaderRow = $htable.children("thead").children("tr.ui-jqgrid-labels:last").addClass("jqg-second-row-header"),
|
||||
$thead = $htable.children("thead"),
|
||||
$theadInTable,
|
||||
originalResizeStop,
|
||||
$firstHeaderRow = $htable.find(".jqg-first-row-header");
|
||||
if ($firstHeaderRow[0] === undefined) {
|
||||
$firstHeaderRow = $('<tr>', {role: "row", "aria-hidden": "true"}).addClass("jqg-first-row-header").css("height", "auto");
|
||||
} else {
|
||||
$firstHeaderRow.empty();
|
||||
}
|
||||
var $firstRow,
|
||||
inColumnHeader = function (text, columnHeaders) {
|
||||
var i = 0, length = columnHeaders.length;
|
||||
for (; i < length; i++) {
|
||||
if (columnHeaders[i] && columnHeaders[i].startColumnName === text) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
|
||||
$(ts).prepend($thead);
|
||||
$thirdHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-third-row-header");
|
||||
$fourHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-four-row-header");
|
||||
|
||||
//循环模型每列
|
||||
for (i = 0; i < cml; i++) {
|
||||
th = ths[i].el;
|
||||
$th = $(th);
|
||||
cmi = colModel[i];
|
||||
// 给第一行添加单元格
|
||||
thStyle = { height: '0px', width: ths[i].width +'px', display: (cmi.hidden ? 'none' : '')};
|
||||
$("<th>", {role: 'gridcell'}).css(thStyle).addClass("ui-first-th-"+ts.p.direction).appendTo($firstHeaderRow);
|
||||
//移除不需要的样式
|
||||
th.style.width = "";
|
||||
|
||||
//是否在threeHeaders配置里面
|
||||
inThreeCol = inColumnHeader(cmi.name, threeHeaders);
|
||||
if (inThreeCol >= 0) {
|
||||
cghi = threeHeaders[inThreeCol];
|
||||
numberOfColumns = parseInt(cghi.numberOfColumns,10);
|
||||
titleText = cghi.titleText;
|
||||
|
||||
// 计算显示的列长度
|
||||
for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
|
||||
if (!colModel[i + iCol].hidden) {
|
||||
cVisibleColumns++;
|
||||
}
|
||||
}
|
||||
|
||||
$colHeader = $('<th>').attr({role: "columnheader",noWrap:true})
|
||||
.addClass("ui-state-default ui-th-column-header ui-th-"+ts.p.direction)
|
||||
.css({'height':'22px', 'border-top':'0px none','overflow':'hidden'})
|
||||
.html(titleText);
|
||||
if(cVisibleColumns > 0) {
|
||||
$colHeader.attr("colspan", String(cVisibleColumns));
|
||||
}
|
||||
if (ts.p.headertitles) {
|
||||
$colHeader.attr("title", $colHeader.text());
|
||||
}
|
||||
//如果没有可见列则隐藏
|
||||
if( cVisibleColumns === 0) {
|
||||
$colHeader.hide();
|
||||
}
|
||||
$th.before($colHeader);
|
||||
threeLevelSkip = numberOfColumns;
|
||||
if (defaultStyle === false) {
|
||||
hasTwoLevel = false;
|
||||
//判断是否存在二层
|
||||
for (var a=0;a<threeLevelSkip && (a+i<cml);a++) {
|
||||
tempInCol = inColumnHeader(colModel[a+i].name, twoHeaders);
|
||||
if (tempInCol>=0) {
|
||||
cghi = twoHeaders[tempInCol];
|
||||
numberOfColumns = parseInt(cghi.numberOfColumns,10);
|
||||
// 计算显示的列长度
|
||||
for (iCol = 0; iCol < numberOfColumns && (a+i+iCol < cml); iCol++) {
|
||||
if (!colModel[a+i+iCol].hidden) {
|
||||
hasTwoLevel = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasTwoLevel === true) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//是否在twoHeaders配置里面
|
||||
inTwoCol = inColumnHeader(cmi.name, twoHeaders);
|
||||
if (threeLevelSkip >0 && inTwoCol >= 0) {
|
||||
cghi = twoHeaders[inTwoCol];
|
||||
numberOfColumns = parseInt(cghi.numberOfColumns,10);
|
||||
titleText = cghi.titleText;
|
||||
|
||||
// 计算显示的列长度
|
||||
for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
|
||||
if (!colModel[i + iCol].hidden) {
|
||||
cVisibleColumns++;
|
||||
}
|
||||
}
|
||||
|
||||
$colHeader = $('<th>').attr({role: "columnheader",noWrap:true})
|
||||
.addClass("ui-state-default ui-th-column-header ui-th-"+ts.p.direction)
|
||||
.css({'height':'22px', 'border-top': '0px none','overflow':'hidden'})
|
||||
.html(titleText);
|
||||
if(cVisibleColumns > 0) {
|
||||
$colHeader.attr("colspan", String(cVisibleColumns));
|
||||
}
|
||||
|
||||
if (ts.p.headertitles) {
|
||||
$colHeader.attr("title", $colHeader.text());
|
||||
}
|
||||
//如果没有可见列则隐藏
|
||||
if( cVisibleColumns === 0) {
|
||||
$colHeader.hide();
|
||||
}
|
||||
$thirdHeaderRow.append($colHeader);
|
||||
twoLevelSkip = numberOfColumns;
|
||||
}
|
||||
|
||||
//不在第三层
|
||||
if (threeLevelSkip === 0) {
|
||||
$th.attr("rowspan", "3");
|
||||
twoLevelSkip = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
//在第三层不在第二层
|
||||
if (threeLevelSkip > 0 && twoLevelSkip === 0) {
|
||||
if (defaultStyle) {
|
||||
$th.attr("rowspan", "2");
|
||||
$thirdHeaderRow.append(th);
|
||||
} else {
|
||||
if (hasTwoLevel) {
|
||||
$th.attr("rowspan", "2");
|
||||
$thirdHeaderRow.append(th);
|
||||
} else {
|
||||
$colHeader.attr("rowspan", "2");
|
||||
$fourHeaderRow.append(th);
|
||||
}
|
||||
}
|
||||
threeLevelSkip--;
|
||||
continue;
|
||||
}
|
||||
|
||||
//在第三层也在第二层
|
||||
if (threeLevelSkip > 0 && twoLevelSkip > 0) {
|
||||
$fourHeaderRow.append(th);
|
||||
threeLevelSkip--;
|
||||
twoLevelSkip--;
|
||||
}
|
||||
}
|
||||
$theadInTable = $(ts).children("thead");
|
||||
$theadInTable.prepend($firstHeaderRow);
|
||||
$thirdHeaderRow.insertAfter($secondHeaderRow);
|
||||
$fourHeaderRow.insertAfter($thirdHeaderRow);
|
||||
$htable.append($theadInTable);
|
||||
|
||||
$htable.find("span.ui-jqgrid-resize").each(function () {
|
||||
var $parent = $(this).parent();
|
||||
if ($parent.is(":visible")) {
|
||||
this.style.cssText = 'height: ' + ($parent.height()/*+4*/) + 'px !important; cursor: col-resize;';
|
||||
}
|
||||
});
|
||||
$htable.find("div.ui-jqgrid-sortable").each(function () {
|
||||
var $ts = $(this), $parent = $ts.parent();
|
||||
if ($parent.is(":visible") && $parent.is(":has(span.ui-jqgrid-resize)")) {
|
||||
$ts.css('top', ($parent.height() - $ts.outerHeight()) / 2 + 'px');
|
||||
}
|
||||
});
|
||||
|
||||
$firstRow = $theadInTable.find("tr.jqg-first-row-header");
|
||||
$(ts).bind('jqGridResizeStop.setGroupHeaders', function (e, nw, idx) {
|
||||
$firstRow.find('th').eq(idx).width(nw);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* 构造多表头冻结表格 by ljq
|
||||
* @参数 maxfrozen : 冻结的列index
|
||||
* @参数 htbl : 表格
|
||||
*/
|
||||
createFrozenHtable : function(maxfrozen, htbl) {
|
||||
var ts = this[0],
|
||||
complexHeader = ts.p.complexHeader,
|
||||
complexHeaders = complexHeader["complexHeaders"],
|
||||
defaultStyle = complexHeaders.defaultStyle,
|
||||
threeHeaders = complexHeaders["threeLevel"],
|
||||
twoHeaders = complexHeaders["twoLevel"],
|
||||
tableid = ts.p.id,
|
||||
colModel = ts.p.colModel,
|
||||
cml = maxfrozen+1,
|
||||
ths = ts.grid.headers,
|
||||
threeLevelSkip = 0,
|
||||
twoLevelSkip = 0,
|
||||
hasTwoLevel = false,
|
||||
i, cmi, thStyle, th, $th, cn, $tempTh, iCol, $colHeader, cghi,
|
||||
tempInCol,
|
||||
inThreeCol,
|
||||
inTwoCol,
|
||||
numberOfColumns,
|
||||
titleText,
|
||||
cVisibleColumns,
|
||||
height = ts.grid.fhDiv.height(),
|
||||
$fhTable = $("<table class='ui-jqgrid-htable' style='width:1px;height:"+ height +"px' role='grid' aria-labelledby='gbox_"+tableid+"' cellspacing='0' cellpadding='0' border='0'></table>"),
|
||||
$thead = $("<thead></thead>"),
|
||||
$firstHeaderRow = $('<tr>', {role: "row", "aria-hidden": "true"}).addClass("jqg-first-row-header").css("height", "auto"),
|
||||
$secondHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-second-row-header"),
|
||||
$thirdHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-third-row-header"),
|
||||
$fourHeaderRow = $('<tr>', {role: "rowheader"}).addClass("ui-jqgrid-labels jqg-four-row-header"),
|
||||
inColumnHeader = function (text, columnHeaders) {
|
||||
var i = 0, length = columnHeaders.length;
|
||||
for (; i < length; i++) {
|
||||
if (columnHeaders[i] && columnHeaders[i].startColumnName === text) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
};
|
||||
|
||||
//循环模型每列
|
||||
for (i = 0; i < cml; i++) {
|
||||
cmi = colModel[i];
|
||||
cn = cmi.name;
|
||||
$th = $("#"+tableid+"_"+cn,htbl);
|
||||
// 给第一行添加单元格
|
||||
thStyle = { height: '0px', width: ths[i].width +'px', display: (cmi.hidden ? 'none' : '')};
|
||||
$("<th>", {role: 'gridcell'}).css(thStyle).addClass("ui-first-th-"+ts.p.direction).appendTo($firstHeaderRow);
|
||||
//是否在threeHeaders配置里面
|
||||
inThreeCol = inColumnHeader(cmi.name, threeHeaders);
|
||||
if (inThreeCol >= 0) {
|
||||
cghi = threeHeaders[inThreeCol];
|
||||
numberOfColumns = parseInt(cghi.numberOfColumns,10);
|
||||
if (numberOfColumns+i-1>maxfrozen) {
|
||||
numberOfColumns = maxfrozen-i+1;
|
||||
}
|
||||
titleText = cghi.titleText;
|
||||
// 计算显示的列长度
|
||||
for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
|
||||
if (!colModel[i + iCol].hidden) {
|
||||
cVisibleColumns++;
|
||||
}
|
||||
}
|
||||
$colHeader = $('<th>').attr({role: "columnheader",noWrap:true})
|
||||
.addClass("ui-state-default ui-th-column-header ui-th-"+ts.p.direction)
|
||||
.css({'height':'22px', 'border-top':'0px none','overflow':'hidden'})
|
||||
.html(titleText);
|
||||
if(cVisibleColumns > 0) {
|
||||
$colHeader.attr("colspan", String(cVisibleColumns));
|
||||
}
|
||||
if (ts.p.headertitles) {
|
||||
$colHeader.attr("title", $colHeader.text());
|
||||
}
|
||||
//如果没有可见列则隐藏
|
||||
if( cVisibleColumns === 0) {
|
||||
$colHeader.hide();
|
||||
}
|
||||
$colHeader.appendTo($secondHeaderRow);
|
||||
threeLevelSkip = numberOfColumns;
|
||||
if (defaultStyle === false) {
|
||||
hasTwoLevel = false;
|
||||
//判断是否存在二层
|
||||
for (var a=0;a<threeLevelSkip && (a+i<cml);a++) {
|
||||
tempInCol = inColumnHeader(colModel[a+i].name, twoHeaders);
|
||||
if (tempInCol>=0) {
|
||||
cghi = twoHeaders[tempInCol];
|
||||
numberOfColumns = parseInt(cghi.numberOfColumns,10);
|
||||
if (numberOfColumns+a+i-1>maxfrozen) {
|
||||
numberOfColumns = maxfrozen-(a+i)+1;
|
||||
}
|
||||
// 计算显示的列长度
|
||||
for (iCol = 0; iCol < numberOfColumns && (a+i+iCol < cml); iCol++) {
|
||||
if (!colModel[a+i+iCol].hidden) {
|
||||
hasTwoLevel = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hasTwoLevel === true) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//是否在twoHeaders配置里面
|
||||
inTwoCol = inColumnHeader(cmi.name, twoHeaders);
|
||||
if (threeLevelSkip >0 && inTwoCol >= 0) {
|
||||
cghi = twoHeaders[inTwoCol];
|
||||
numberOfColumns = parseInt(cghi.numberOfColumns,10);
|
||||
if (numberOfColumns+i-1>maxfrozen) {
|
||||
numberOfColumns = maxfrozen-i+1;
|
||||
}
|
||||
titleText = cghi.titleText;
|
||||
// 计算显示的列长度
|
||||
for (cVisibleColumns = 0, iCol = 0; iCol < numberOfColumns && (i + iCol < cml); iCol++) {
|
||||
if (!colModel[i + iCol].hidden) {
|
||||
cVisibleColumns++;
|
||||
}
|
||||
}
|
||||
$colHeader = $('<th>').attr({role: "columnheader",noWrap:true})
|
||||
.addClass("ui-state-default ui-th-column-header ui-th-"+ts.p.direction)
|
||||
.css({'height':'22px', 'border-top': '0px none','overflow':'hidden'})
|
||||
.html(titleText);
|
||||
if(cVisibleColumns > 0) {
|
||||
$colHeader.attr("colspan", String(cVisibleColumns));
|
||||
}
|
||||
if (ts.p.headertitles) {
|
||||
$colHeader.attr("title", $colHeader.text());
|
||||
}
|
||||
//如果没有可见列则隐藏
|
||||
if( cVisibleColumns === 0) {
|
||||
$colHeader.hide();
|
||||
}
|
||||
$colHeader.appendTo($thirdHeaderRow);
|
||||
twoLevelSkip = numberOfColumns;
|
||||
}
|
||||
//不在第三层
|
||||
if (threeLevelSkip === 0) {
|
||||
$th.attr("rowspan", "3");
|
||||
$th.appendTo($secondHeaderRow);
|
||||
twoLevelSkip = 0;
|
||||
continue;
|
||||
}
|
||||
//在第三层不在第二层
|
||||
if (threeLevelSkip > 0 && twoLevelSkip === 0) {
|
||||
if (defaultStyle) {
|
||||
$th.attr("rowspan", "2");
|
||||
$th.appendTo($thirdHeaderRow);
|
||||
} else {
|
||||
if (hasTwoLevel) {
|
||||
$th.attr("rowspan", "2");
|
||||
$th.appendTo($thirdHeaderRow);
|
||||
} else {
|
||||
$colHeader.attr("rowspan", "2");
|
||||
$th.appendTo($fourHeaderRow);
|
||||
}
|
||||
}
|
||||
threeLevelSkip--;
|
||||
continue;
|
||||
}
|
||||
//在第三层也在第二层
|
||||
if (threeLevelSkip > 0 && twoLevelSkip > 0) {
|
||||
$th.appendTo($fourHeaderRow);
|
||||
threeLevelSkip--;
|
||||
twoLevelSkip--;
|
||||
}
|
||||
}
|
||||
var thirdLen = $thirdHeaderRow.children().length,
|
||||
fourLen = $fourHeaderRow.children().length;
|
||||
if (thirdLen=== 0 && fourLen === 0) {
|
||||
$secondHeaderRow.height(height);
|
||||
}
|
||||
if (defaultStyle) {
|
||||
//默认渲染样式处理
|
||||
if (thirdLen > 0 && fourLen === 0) {
|
||||
$thirdHeaderRow.height(height-23);
|
||||
}
|
||||
} else {
|
||||
if (thirdLen === 0 && fourLen > 0) {
|
||||
$secondHeaderRow.height(height-23);
|
||||
$secondHeaderRow.find("th").each(function(){
|
||||
var rowspan = $(this).attr("rowspan");
|
||||
if (rowspan) {
|
||||
$(this).attr("rowspan",String(parseInt(rowspan,10)-1));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$firstHeaderRow.appendTo($thead);
|
||||
$secondHeaderRow.appendTo($thead);
|
||||
thirdLen && $thirdHeaderRow.appendTo($thead);
|
||||
fourLen && $fourHeaderRow.appendTo($thead);
|
||||
$thead.appendTo($fhTable);
|
||||
return $fhTable;
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,249 @@
|
||||
(function($){
|
||||
$.jgrid.extend({
|
||||
setFrozenColumns : function (type) {
|
||||
// $(this).jqGrid('setFrozenColumnsPlus', 'left');
|
||||
$(this).jqGrid('setFrozenColumnsPlus', 'right');
|
||||
},
|
||||
setFrozenColumnsPlus : function (type) {
|
||||
return this.each(function() {
|
||||
if ( !this.grid ) {return;}
|
||||
if ( !type ) { type = 'left'; }
|
||||
var $t = this, cm = $t.p.colModel,i=0, len = cm.length, maxfrozen = -1, frozen = false, isLeft = type == 'left';
|
||||
if ( !$t.grid.fcs ) {$t.grid.fcs = {left:{}, right:{}};}
|
||||
// TODO treeGrid and grouping Support
|
||||
if($t.p.subGrid === true || $t.p.treeGrid === true || $t.p.cellEdit === true || $t.p.sortable || $t.p.scroll ) {
|
||||
return;
|
||||
}
|
||||
if (isLeft){
|
||||
if($t.p.rownumbers) { i++; }
|
||||
if($t.p.multiselect) { i++; }
|
||||
// get the max index of frozen col
|
||||
while(i<len) {
|
||||
// from left, no breaking frozen
|
||||
if(cm[i].frozen === true) {
|
||||
frozen = true;
|
||||
maxfrozen = i;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}else{
|
||||
i = len-1;
|
||||
while(i>0) {
|
||||
// from left, no breaking frozen
|
||||
if(cm[i].frozen === true) {
|
||||
frozen = true;
|
||||
maxfrozen = i;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
i--;
|
||||
}
|
||||
}
|
||||
if(maxfrozen>=0 && frozen) {
|
||||
var top = $t.p.caption ? $($t.grid.cDiv).outerHeight() : 0,
|
||||
hth = $(".ui-jqgrid-htable","#gview_"+$.jgrid.jqID($t.p.id)).height();
|
||||
//headers
|
||||
if($t.p.toppager) {
|
||||
top = top + $($t.grid.topDiv).outerHeight();
|
||||
}
|
||||
if($t.p.toolbar[0] === true) {
|
||||
if($t.p.toolbar[1] !== "bottom") {
|
||||
top = top + $($t.grid.uDiv).outerHeight();
|
||||
}
|
||||
}
|
||||
//$t.grid.fhDiv = $('<div style="position:absolute;left:0px;top:'+top+'px;height:'+hth+'px;" class="frozen-div ui-state-default ui-jqgrid-hdiv"></div>');
|
||||
$t.grid.fcs[type].fhDiv = $('<div style="position:absolute;'+(isLeft?'left:0':'right:11px')+';top:'+top+'px;height2:'+hth+'px;z-index:1" class="frozen-div ui-state-default ui-jqgrid-hdiv"></div>'); // ThinkGem 修正标题栏高度计算错误
|
||||
//$t.grid.fcs[type].fbDiv = $('<div style="position:absolute;left:0px;top:'+(parseInt(top,10)+parseInt(hth,10) + 1)+'px;overflow-y:hidden" class="frozen-bdiv ui-jqgrid-bdiv"></div>');
|
||||
$t.grid.fcs[type].fbDiv = $('<div style="position:absolute;'+(isLeft?'left:0':'right:11px')+';top:'+(parseInt(top,10)+parseInt(hth,10))+'px;overflow:hidden" class="frozen-bdiv ui-jqgrid-bdiv"></div>'); // ThinkGem 修正标题栏高度计算错误
|
||||
$("#gview_"+$.jgrid.jqID($t.p.id)).append($t.grid.fcs[type].fhDiv);
|
||||
var htbl = $(".ui-jqgrid-htable","#gview_"+$.jgrid.jqID($t.p.id)).clone(true);
|
||||
// groupheader support - only if useColSpanstyle is false
|
||||
// if($t.p.groupHeader) { //
|
||||
if($t.p.groupHeader || $t.p.groupHeaders) { // ThinkGem 增加三级表头锁定
|
||||
$("tr.jqg-first-row-header,tr.jqg-third-row-header,tr.jqg-four-row-header", htbl).each(function(){
|
||||
if(isLeft){
|
||||
$("th:gt("+maxfrozen+")",this).remove();
|
||||
}else{
|
||||
$("th:lt("+maxfrozen+")",this).remove();
|
||||
}
|
||||
});
|
||||
var swapfroz = -1, fdel = -1, cs, rs;
|
||||
$("tr.jqg-second-row-header th", htbl).each(function(){
|
||||
cs= parseInt($(this).attr("colspan"),10);
|
||||
rs= parseInt($(this).attr("rowspan"),10);
|
||||
if(rs) {
|
||||
swapfroz++;
|
||||
fdel++;
|
||||
}
|
||||
if(cs) {
|
||||
swapfroz = swapfroz+cs;
|
||||
fdel++;
|
||||
}
|
||||
if(swapfroz === maxfrozen) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
if(swapfroz !== maxfrozen) {
|
||||
fdel = maxfrozen;
|
||||
}
|
||||
$("tr.jqg-second-row-header", htbl).each(function(){
|
||||
if (fdel > 0){
|
||||
if(isLeft){
|
||||
$("th:gt("+fdel+")",this).remove();
|
||||
}else{
|
||||
$("th:lt("+fdel+")",this).remove();
|
||||
}
|
||||
}else{
|
||||
$("th",this).remove();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$("tr",htbl).each(function(){
|
||||
if(isLeft){
|
||||
$("th:gt("+maxfrozen+")",this).remove();
|
||||
}else{
|
||||
$("th:lt("+maxfrozen+")",this).remove();
|
||||
}
|
||||
});
|
||||
}
|
||||
$(htbl).width(1);
|
||||
// resizing stuff
|
||||
$($t.grid.fcs[type].fhDiv).append(htbl).mousemove(function (e) {
|
||||
if($t.grid.resizing){ $t.grid.dragMove(e);return false; }
|
||||
});
|
||||
if($t.p.footerrow) {
|
||||
var hbd = $(".ui-jqgrid-bdiv","#gview_"+$.jgrid.jqID($t.p.id)).height();
|
||||
|
||||
//$t.grid.fcs[type].fsDiv = $('<div style="position:absolute;left:0px;top:'+(parseInt(top,10)+parseInt(hth,10) + parseInt(hbd,10)+1)+'px;" class="frozen-sdiv ui-jqgrid-sdiv"></div>');
|
||||
$t.grid.fcs[type].fsDiv = $('<div style="position:absolute;left:0px;bottom:0px;" class="frozen-sdiv ui-jqgrid-sdiv"></div>'); // ThinkGem 修正锁定列,统计行位置计算错误
|
||||
$("#gview_"+$.jgrid.jqID($t.p.id)).append($t.grid.fcs[type].fsDiv);
|
||||
var ftbl = $(".ui-jqgrid-ftable","#gview_"+$.jgrid.jqID($t.p.id)).clone(true);
|
||||
$("tr",ftbl).each(function(){
|
||||
if(isLeft){
|
||||
$("td:gt("+maxfrozen+")",this).remove();
|
||||
}else{
|
||||
$("td:lt("+maxfrozen+")",this).remove();
|
||||
}
|
||||
});
|
||||
$(ftbl).width(1);
|
||||
$($t.grid.fcs[type].fsDiv).append(ftbl);
|
||||
}
|
||||
$($t).bind('jqGridResizeStop.setFrozenColumns', function (e, w, index) {
|
||||
var rhth = $(".ui-jqgrid-htable",$t.grid.fcs[type].fhDiv);
|
||||
$("th:eq("+index+")",rhth).width( w );
|
||||
var btd = $(".ui-jqgrid-btable",$t.grid.fcs[type].fbDiv);
|
||||
$("tr:first td:eq("+index+")",btd).width( w );
|
||||
if($t.p.footerrow) {
|
||||
var ftd = $(".ui-jqgrid-ftable",$t.grid.fcs[type].fsDiv);
|
||||
$("tr:first td:eq("+index+")",ftd).width( w );
|
||||
}
|
||||
});
|
||||
// sorting stuff
|
||||
$($t).bind('jqGridSortCol.setFrozenColumns', function (e, index, idxcol) {
|
||||
|
||||
var previousSelectedTh = $("tr.ui-jqgrid-labels:last th:eq("+$t.p.lastsort+")",$t.grid.fcs[type].fhDiv), newSelectedTh = $("tr.ui-jqgrid-labels:last th:eq("+idxcol+")",$t.grid.fcs[type].fhDiv);
|
||||
|
||||
$("span.ui-grid-ico-sort",previousSelectedTh).addClass('ui-state-disabled');
|
||||
$(previousSelectedTh).attr("aria-selected","false");
|
||||
$("span.ui-icon-"+$t.p.sortorder,newSelectedTh).removeClass('ui-state-disabled');
|
||||
$(newSelectedTh).attr("aria-selected","true");
|
||||
if(!$t.p.viewsortcols[0]) {
|
||||
if($t.p.lastsort !== idxcol) {
|
||||
$("span.s-ico",previousSelectedTh).hide();
|
||||
$("span.s-ico",newSelectedTh).show();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// data stuff
|
||||
//TODO support for setRowData
|
||||
$("#gview_"+$.jgrid.jqID($t.p.id)).append($t.grid.fcs[type].fbDiv);
|
||||
$($t.grid.bDiv).scroll(function () {
|
||||
$($t.grid.fcs[type].fbDiv).scrollTop($(this).scrollTop());
|
||||
});
|
||||
if($t.p.hoverrows === true) {
|
||||
$("#"+$.jgrid.jqID($t.p.id)).unbind('mouseover').unbind('mouseout');
|
||||
}
|
||||
$($t).bind('jqGridAfterGridComplete.setFrozenColumns', function () {
|
||||
log($("#"+$.jgrid.jqID($t.p.id)+"_frozen").length)
|
||||
$("#"+$.jgrid.jqID($t.p.id)+"_frozen").remove();
|
||||
$($t.grid.fcs[type].fhDiv).height($($t.grid.hDiv).height()); // ThinkGem add 修正锁定列,标题栏高度计算错误
|
||||
//$($t.grid.fcs[type].fbDiv).height($($t.grid.bDiv).height()-16);
|
||||
$($t.grid.fcs[type].fbDiv).height($($t.grid.bDiv).height()-16+($.jgrid.bigscroll?0:4)); // ThinkGem 修正IE下高度计算错误
|
||||
//$($t.grid.fcs[type].fsDiv).css('top', $($t.grid.hDiv).height() + $($t.grid.fcs[type].fbDiv).height() - $($t.grid.fcs[type].fsDiv).height() - 1 + 5); // ThinkGem 修正锁定列,统计行位置计算错误
|
||||
// ThinkGem 凑合用IE8下冻结列显示问题
|
||||
//if (!! navigator.userAgent.match(/MSIE/) || !!(navigator.userAgent.match(/Trident/))){
|
||||
/*if (!!navigator.userAgent.match(/MSIE 8.0/)){
|
||||
setTimeout(function(){
|
||||
$($t.grid.fcs[type].fhDiv).height($($t.grid.hDiv).height() + 100);
|
||||
$($t.grid.fcs[type].fbDiv).height($($t.grid.bDiv).height() + 2);
|
||||
$($t.grid.fcs[type].fbDiv).css('top', $($t.grid.hDiv).height()+1);
|
||||
$($t.grid.fcs[type].fsDiv).css('top', $($t.grid.hDiv).height() + $($t.grid.fcs[type].fbDiv).height() - $($t.grid.fcs[type].fsDiv).height() - 1);
|
||||
}, 200);
|
||||
}*/
|
||||
var btbl = $("#"+$.jgrid.jqID($t.p.id)).clone(true);
|
||||
log(btbl)
|
||||
$("tr[role=row]",btbl).each(function(){
|
||||
if(isLeft){
|
||||
$("td[role=gridcell]:gt("+maxfrozen+")",this).remove();
|
||||
}else{
|
||||
$("td[role=gridcell]:lt("+maxfrozen+")",this).remove();
|
||||
}
|
||||
});
|
||||
|
||||
$(btbl).width(1).attr("id",$t.p.id+"_frozen");
|
||||
$($t.grid.fcs[type].fbDiv).append(btbl);
|
||||
$($t.grid.bDiv).scroll(); // ThinkGem 排序后,重置冻结列滚动位置
|
||||
if($t.p.hoverrows === true) {
|
||||
$("tr.jqgrow", btbl).hover(
|
||||
function(){ $(this).addClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)).addClass("ui-state-hover"); },
|
||||
function(){ $(this).removeClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)).removeClass("ui-state-hover"); }
|
||||
);
|
||||
$("tr.jqgrow", "#"+$.jgrid.jqID($t.p.id)).hover(
|
||||
function(){ $(this).addClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)+"_frozen").addClass("ui-state-hover");},
|
||||
function(){ $(this).removeClass("ui-state-hover"); $("#"+$.jgrid.jqID(this.id), "#"+$.jgrid.jqID($t.p.id)+"_frozen").removeClass("ui-state-hover"); }
|
||||
);
|
||||
}
|
||||
btbl=null;
|
||||
});
|
||||
if(!$t.grid.hDiv.loading) {
|
||||
$($t).triggerHandler("jqGridAfterGridComplete");
|
||||
}
|
||||
$t.p.frozenColumns = true;
|
||||
}
|
||||
});
|
||||
},
|
||||
destroyFrozenColumns : function(type) {
|
||||
return this.each(function() {
|
||||
if ( !this.grid ) {return;}
|
||||
if ( !type ) { type = 'left'; }
|
||||
if(this.p.frozenColumns === true) {
|
||||
var $t = this;
|
||||
$($t.grid.fcs[type].fhDiv).remove();
|
||||
$($t.grid.fcs[type].fbDiv).remove();
|
||||
$t.grid.fcs[type].fhDiv = null; $t.grid.fcs[type].fbDiv=null;
|
||||
if($t.p.footerrow) {
|
||||
$($t.grid.fcs[type].fsDiv).remove();
|
||||
$t.grid.fcs[type].fsDiv = null;
|
||||
}
|
||||
$(this).unbind('.setFrozenColumns');
|
||||
if($t.p.hoverrows === true) {
|
||||
var ptr;
|
||||
$("#"+$.jgrid.jqID($t.p.id)).bind('mouseover',function(e) {
|
||||
ptr = $(e.target).closest("tr.jqgrow");
|
||||
if($(ptr).attr("class") !== "ui-subgrid") {
|
||||
$(ptr).addClass("ui-state-hover");
|
||||
}
|
||||
}).bind('mouseout',function(e) {
|
||||
ptr = $(e.target).closest("tr.jqgrow");
|
||||
$(ptr).removeClass("ui-state-hover");
|
||||
});
|
||||
}
|
||||
this.p.frozenColumns = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,64 @@
|
||||
;(function($){
|
||||
/**
|
||||
* jqGrid extension
|
||||
* Paul Tiseo ptiseo@wasteconsultants.com
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html
|
||||
**/
|
||||
$.jgrid.extend({
|
||||
getPostData : function(){
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
return $t.p.postData;
|
||||
},
|
||||
setPostData : function( newdata ) {
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
// check if newdata is correct type
|
||||
if ( typeof(newdata) === 'object' ) {
|
||||
$t.p.postData = newdata;
|
||||
}
|
||||
else {
|
||||
alert("Error: cannot add a non-object postData value. postData unchanged.");
|
||||
}
|
||||
},
|
||||
appendPostData : function( newdata ) {
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
// check if newdata is correct type
|
||||
if ( typeof(newdata) === 'object' ) {
|
||||
$.extend($t.p.postData, newdata);
|
||||
}
|
||||
else {
|
||||
alert("Error: cannot append a non-object postData value. postData unchanged.");
|
||||
}
|
||||
},
|
||||
setPostDataItem : function( key, val ) {
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
$t.p.postData[key] = val;
|
||||
},
|
||||
getPostDataItem : function( key ) {
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
return $t.p.postData[key];
|
||||
},
|
||||
removePostDataItem : function( key ) {
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
delete $t.p.postData[key];
|
||||
},
|
||||
getUserData : function(){
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
return $t.p.userData;
|
||||
},
|
||||
getUserDataItem : function( key ) {
|
||||
var $t = this[0];
|
||||
if(!$t.grid) { return; }
|
||||
return $t.p.userData[key];
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,126 @@
|
||||
;(function($){
|
||||
/**
|
||||
* jqGrid extension for manipulating columns properties
|
||||
* Piotr Roznicki roznicki@o2.pl
|
||||
* http://www.roznicki.prv.pl
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl-2.0.html
|
||||
**/
|
||||
$.jgrid.extend({
|
||||
setColumns : function(p) {
|
||||
p = $.extend({
|
||||
top : 0,
|
||||
left: 0,
|
||||
width: 200,
|
||||
height: 'auto',
|
||||
dataheight: 'auto',
|
||||
modal: false,
|
||||
drag: true,
|
||||
beforeShowForm: null,
|
||||
afterShowForm: null,
|
||||
afterSubmitForm: null,
|
||||
closeOnEscape : true,
|
||||
ShrinkToFit : false,
|
||||
jqModal : false,
|
||||
saveicon: [true,"left","ui-icon-disk"],
|
||||
closeicon: [true,"left","ui-icon-close"],
|
||||
onClose : null,
|
||||
colnameview : true,
|
||||
closeAfterSubmit : true,
|
||||
updateAfterCheck : false,
|
||||
recreateForm : false
|
||||
}, $.jgrid.col, p ||{});
|
||||
return this.each(function(){
|
||||
var $t = this;
|
||||
if (!$t.grid ) { return; }
|
||||
var onBeforeShow = typeof p.beforeShowForm === 'function' ? true: false;
|
||||
var onAfterShow = typeof p.afterShowForm === 'function' ? true: false;
|
||||
var onAfterSubmit = typeof p.afterSubmitForm === 'function' ? true: false;
|
||||
var gID = $t.p.id,
|
||||
dtbl = "ColTbl_"+gID,
|
||||
IDs = {themodal:'colmod'+gID,modalhead:'colhd'+gID,modalcontent:'colcnt'+gID, scrollelm: dtbl};
|
||||
if(p.recreateForm===true && $("#"+IDs.themodal).html() != null) {
|
||||
$("#"+IDs.themodal).remove();
|
||||
}
|
||||
if ( $("#"+IDs.themodal).html() != null ) {
|
||||
if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); }
|
||||
$.jgrid.viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, jqM:false, modal:p.modal});
|
||||
if(onAfterShow) { p.afterShowForm($("#"+dtbl)); }
|
||||
} else {
|
||||
var dh = isNaN(p.dataheight) ? p.dataheight : p.dataheight+"px";
|
||||
var formdata = "<div id='"+dtbl+"' class='formdata' style='width:100%;overflow:auto;position:relative;height:"+dh+";'>";
|
||||
formdata += "<table class='ColTable' cellspacing='1' cellpading='2' border='0'><tbody>";
|
||||
for(i=0;i<this.p.colNames.length;i++){
|
||||
if(!$t.p.colModel[i].hidedlg) { // added from T. Tomov
|
||||
formdata += "<tr><td style='white-space: pre;'><input type='checkbox' style='margin-right:5px;' id='col_" + this.p.colModel[i].name + "' class='cbox' value='T' " +
|
||||
((this.p.colModel[i].hidden===false)?"checked":"") + "/>" + "<label for='col_" + this.p.colModel[i].name + "'>" + this.p.colNames[i] + ((p.colnameview) ? " (" + this.p.colModel[i].name + ")" : "" )+ "</label></td></tr>";
|
||||
}
|
||||
}
|
||||
formdata += "</tbody></table></div>"
|
||||
var bS = !p.updateAfterCheck ? "<a href='javascript:void(0)' id='dData' class='fm-button ui-state-default ui-corner-all'>"+p.bSubmit+"</a>" : "",
|
||||
bC ="<a href='javascript:void(0)' id='eData' class='fm-button ui-state-default ui-corner-all'>"+p.bCancel+"</a>";
|
||||
formdata += "<table border='0' class='EditTable' id='"+dtbl+"_2'><tbody><tr style='display:block;height:3px;'><td></td></tr><tr><td class='DataTD ui-widget-content'></td></tr><tr><td class='ColButton EditButton'>"+bS+" "+bC+"</td></tr></tbody></table>";
|
||||
p.gbox = "#gbox_"+gID;
|
||||
$.jgrid.createModal(IDs,formdata,p,"#gview_"+$t.p.id,$("#gview_"+$t.p.id)[0]);
|
||||
if(p.saveicon[0]==true) {
|
||||
$("#dData","#"+dtbl+"_2").addClass(p.saveicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
|
||||
.append("<span class='ui-icon "+p.saveicon[2]+"'></span>");
|
||||
}
|
||||
if(p.closeicon[0]==true) {
|
||||
$("#eData","#"+dtbl+"_2").addClass(p.closeicon[1] == "right" ? 'fm-button-icon-right' : 'fm-button-icon-left')
|
||||
.append("<span class='ui-icon "+p.closeicon[2]+"'></span>");
|
||||
}
|
||||
if(!p.updateAfterCheck) {
|
||||
$("#dData","#"+dtbl+"_2").click(function(e){
|
||||
for(i=0;i<$t.p.colModel.length;i++){
|
||||
if(!$t.p.colModel[i].hidedlg) { // added from T. Tomov
|
||||
var nm = $t.p.colModel[i].name.replace(/\./g, "\\.");
|
||||
if($("#col_" + nm,"#"+dtbl).attr("checked")) {
|
||||
$($t).jqGrid("showCol",$t.p.colModel[i].name);
|
||||
$("#col_" + nm,"#"+dtbl).attr("defaultChecked",true); // Added from T. Tomov IE BUG
|
||||
} else {
|
||||
$($t).jqGrid("hideCol",$t.p.colModel[i].name);
|
||||
$("#col_" + nm,"#"+dtbl).attr("defaultChecked",""); // Added from T. Tomov IE BUG
|
||||
}
|
||||
}
|
||||
}
|
||||
if(p.ShrinkToFit===true) {
|
||||
$($t).jqGrid("setGridWidth",$t.grid.width-0.001,true);
|
||||
}
|
||||
if(p.closeAfterSubmit) $.jgrid.hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: p.onClose});
|
||||
if (onAfterSubmit) { p.afterSubmitForm($("#"+dtbl)); }
|
||||
return false;
|
||||
});
|
||||
} else {
|
||||
$(":input","#"+dtbl).click(function(e){
|
||||
var cn = this.id.substr(4);
|
||||
if(cn){
|
||||
if(this.checked) {
|
||||
$($t).jqGrid("showCol",cn);
|
||||
} else {
|
||||
$($t).jqGrid("hideCol",cn);
|
||||
}
|
||||
if(p.ShrinkToFit===true) {
|
||||
$($t).jqGrid("setGridWidth",$t.grid.width-0.001,true);
|
||||
}
|
||||
}
|
||||
return this;
|
||||
});
|
||||
}
|
||||
$("#eData", "#"+dtbl+"_2").click(function(e){
|
||||
$.jgrid.hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:p.jqModal, onClose: p.onClose});
|
||||
return false;
|
||||
});
|
||||
$("#dData, #eData","#"+dtbl+"_2").hover(
|
||||
function(){$(this).addClass('ui-state-hover');},
|
||||
function(){$(this).removeClass('ui-state-hover');}
|
||||
);
|
||||
if(onBeforeShow) { p.beforeShowForm($("#"+dtbl)); }
|
||||
$.jgrid.viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:p.jqModal, jqM: true, modal:p.modal});
|
||||
if(onAfterShow) { p.afterShowForm($("#"+dtbl)); }
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -0,0 +1,147 @@
|
||||
/*
|
||||
* ContextMenu - jQuery plugin for right-click context menus
|
||||
*
|
||||
* Author: Chris Domigan
|
||||
* Contributors: Dan G. Switzer, II
|
||||
* Parts of this plugin are inspired by Joern Zaefferer's Tooltip plugin
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* Version: r2
|
||||
* Date: 16 July 2007
|
||||
*
|
||||
* For documentation visit http://www.trendskitchens.co.nz/jquery/contextmenu/
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
var menu, shadow, content, hash, currentTarget;
|
||||
var defaults = {
|
||||
menuStyle: {
|
||||
listStyle: 'none',
|
||||
padding: '1px',
|
||||
margin: '0px',
|
||||
backgroundColor: '#fff',
|
||||
border: '1px solid #999',
|
||||
width: '100px'
|
||||
},
|
||||
itemStyle: {
|
||||
margin: '0px',
|
||||
color: '#000',
|
||||
display: 'block',
|
||||
cursor: 'default',
|
||||
padding: '3px',
|
||||
border: '1px solid #fff',
|
||||
backgroundColor: 'transparent'
|
||||
},
|
||||
itemHoverStyle: {
|
||||
border: '1px solid #0a246a',
|
||||
backgroundColor: '#b6bdd2'
|
||||
},
|
||||
eventPosX: 'pageX',
|
||||
eventPosY: 'pageY',
|
||||
shadow : true,
|
||||
onContextMenu: null,
|
||||
onShowMenu: null
|
||||
};
|
||||
|
||||
$.fn.contextMenu = function(id, options) {
|
||||
if (!menu) { // Create singleton menu
|
||||
menu = $('<div id="jqContextMenu"></div>')
|
||||
.hide()
|
||||
.css({position:'absolute', zIndex:'500'})
|
||||
.appendTo('body')
|
||||
.bind('click', function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
}
|
||||
if (!shadow) {
|
||||
shadow = $('<div></div>')
|
||||
.css({backgroundColor:'#000',position:'absolute',opacity:0.2,zIndex:499})
|
||||
.appendTo('body')
|
||||
.hide();
|
||||
}
|
||||
hash = hash || [];
|
||||
hash.push({
|
||||
id : id,
|
||||
menuStyle: $.extend({}, defaults.menuStyle, options.menuStyle || {}),
|
||||
itemStyle: $.extend({}, defaults.itemStyle, options.itemStyle || {}),
|
||||
itemHoverStyle: $.extend({}, defaults.itemHoverStyle, options.itemHoverStyle || {}),
|
||||
bindings: options.bindings || {},
|
||||
shadow: options.shadow || options.shadow === false ? options.shadow : defaults.shadow,
|
||||
onContextMenu: options.onContextMenu || defaults.onContextMenu,
|
||||
onShowMenu: options.onShowMenu || defaults.onShowMenu,
|
||||
eventPosX: options.eventPosX || defaults.eventPosX,
|
||||
eventPosY: options.eventPosY || defaults.eventPosY
|
||||
});
|
||||
|
||||
var index = hash.length - 1;
|
||||
$(this).bind('contextmenu', function(e) {
|
||||
// Check if onContextMenu() defined
|
||||
var bShowContext = (!!hash[index].onContextMenu) ? hash[index].onContextMenu(e) : true;
|
||||
currentTarget = e.target;
|
||||
if (bShowContext) {
|
||||
display(index, this, e );
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
function display(index, trigger, e ) {
|
||||
var cur = hash[index];
|
||||
content = $('#'+cur.id).find('ul:first').clone(true);
|
||||
content.css(cur.menuStyle).find('li').css(cur.itemStyle).hover(
|
||||
function() {
|
||||
$(this).css(cur.itemHoverStyle);
|
||||
},
|
||||
function(){
|
||||
$(this).css(cur.itemStyle);
|
||||
}
|
||||
).find('img').css({verticalAlign:'middle',paddingRight:'2px'});
|
||||
|
||||
// Send the content to the menu
|
||||
menu.html(content);
|
||||
|
||||
// if there's an onShowMenu, run it now -- must run after content has been added
|
||||
// if you try to alter the content variable before the menu.html(), IE6 has issues
|
||||
// updating the content
|
||||
if (!!cur.onShowMenu) menu = cur.onShowMenu(e, menu);
|
||||
|
||||
$.each(cur.bindings, function(id, func) {
|
||||
$('#'+id, menu).bind('click', function() {
|
||||
hide();
|
||||
func(trigger, currentTarget);
|
||||
});
|
||||
});
|
||||
|
||||
menu.css({'left':e[cur.eventPosX],'top':e[cur.eventPosY]}).show();
|
||||
if (cur.shadow) shadow.css({width:menu.width(),height:menu.height(),left:e.pageX+2,top:e.pageY+2}).show();
|
||||
$(document).one('click', hide);
|
||||
}
|
||||
|
||||
function hide() {
|
||||
menu.hide();
|
||||
shadow.hide();
|
||||
}
|
||||
|
||||
// Apply defaults
|
||||
$.contextMenu = {
|
||||
defaults : function(userDefaults) {
|
||||
$.each(userDefaults, function(i, val) {
|
||||
if (typeof val == 'object' && defaults[i]) {
|
||||
$.extend(defaults[i], val);
|
||||
}
|
||||
else defaults[i] = val;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
|
||||
$(function() {
|
||||
$('div.contextMenu').hide();
|
||||
});
|
||||
@@ -0,0 +1,716 @@
|
||||
/* Plugin: searchFilter v1.2.9
|
||||
* Author: Kasey Speakman (kasey@cornerspeed.com)
|
||||
* License: Dual Licensed, MIT and GPL v2 (http://www.gnu.org/licenses/gpl-2.0.html)
|
||||
*
|
||||
* REQUIREMENTS:
|
||||
* jQuery 1.3+ (http://jquery.com/)
|
||||
* A Themeroller Theme (http://jqueryui.com/themeroller/)
|
||||
*
|
||||
* SECURITY WARNING
|
||||
* You should always implement server-side checking to ensure that
|
||||
* the query will fail when forged/invalid data is received.
|
||||
* Clever users can send any value they want through JavaScript and HTTP POST/GET.
|
||||
*
|
||||
* THEMES
|
||||
* Simply include the CSS file for your Themeroller theme.
|
||||
*
|
||||
* DESCRIPTION
|
||||
* This plugin creates a new searchFilter object in the specified container
|
||||
*
|
||||
* INPUT TYPE
|
||||
* fields: an array of field objects. each object has the following properties:
|
||||
* text: a string containing the display name of the field (e.g. "Field 1")
|
||||
* itemval: a string containing the actual field name (e.g. "field1")
|
||||
* optional properties:
|
||||
* ops: an array of operators in the same format as jQuery.fn.searchFilter.defaults.operators
|
||||
* that is: [ { op: 'gt', text: 'greater than'}, { op:'lt', text: 'less than'}, ... ]
|
||||
* if not specified, the passed-in options used, and failting that, jQuery.fn.searchFilter.defaults.operators will be used
|
||||
* *** NOTE ***
|
||||
* Specifying a dataUrl or dataValues property means that a <select ...> (drop-down-list) will be generated
|
||||
* instead of a text input <input type='text'.../> where the user would normally type in their search data
|
||||
* ************
|
||||
* dataUrl: a url that will return the html select for this field, this url will only be called once for this field
|
||||
* dataValues: the possible values for this field in the form [ { text: 'Data Display Text', value: 'data_actual_value' }, { ... } ]
|
||||
* dataInit: a function that you can use to initialize the data field. this function is passed the jQuery-fied data element
|
||||
* dataEvents: list of events to apply to the data element. uses $("#id").bind(type, [data], fn) to bind events to data element
|
||||
* *** JSON of this object could look like this: ***
|
||||
* var fields = [
|
||||
* {
|
||||
* text: 'Field Display Name',
|
||||
* itemval: 'field_actual_name',
|
||||
* // below this are optional values
|
||||
* ops: [ // this format is the same as jQuery.fn.searchFilter.defaults.operators
|
||||
* { op: 'gt', text: 'greater than' },
|
||||
* { op: 'lt', text: 'less than' }
|
||||
* ],
|
||||
* dataUrl: 'http://server/path/script.php?propName=propValue', // using this creates a select for the data input instead of an input type='text'
|
||||
* dataValues: [ // using this creates a select for the data input instead of an input type='text'
|
||||
* { text: 'Data Value Display Name', value: 'data_actual_value' },
|
||||
* { ... }
|
||||
* ],
|
||||
* dataInit: function(jElem) { jElem.datepicker(options); },
|
||||
* dataEvents: [ // these are the same options that you pass to $("#id").bind(type, [data], fn)
|
||||
* { type: 'click', data: { i: 7 }, fn: function(e) { console.log(e.data.i); } },
|
||||
* { type: 'keypress', fn: function(e) { console.log('keypress'); } }
|
||||
* ]
|
||||
* },
|
||||
* { ... }
|
||||
* ]
|
||||
* options: name:value properties containing various creation options
|
||||
* see jQuery.fn.searchFilter.defaults for the overridable options
|
||||
*
|
||||
* RETURN TYPE: This plugin returns a SearchFilter object, which has additional SearchFilter methods:
|
||||
* Methods
|
||||
* add: Adds a filter. added to the end of the list unless a jQuery event object or valid row number is passed.
|
||||
* del: Removes a filter. removed from the end of the list unless a jQuery event object or valid row number is passed.
|
||||
* reset: resets filters back to original state (only one blank filter), and calls onReset
|
||||
* search: puts the search rules into an object and calls onSearch with it
|
||||
* close: calls the onClose event handler
|
||||
*
|
||||
* USAGE
|
||||
* HTML
|
||||
* <head>
|
||||
* ...
|
||||
* <script src="path/to/jquery.min.js" type="text/javascript"></script>
|
||||
* <link href="path/to/themeroller.css" rel="Stylesheet" type="text/css" />
|
||||
* <script src="path/to/jquery.searchFilter.js" type="text/javascript"></script>
|
||||
* <link href="path/to/jquery.searchFilter.css" rel="Stylesheet" type="text/css" />
|
||||
* ...
|
||||
* </head>
|
||||
* <body>
|
||||
* ...
|
||||
* <div id='mySearch'></div>
|
||||
* ...
|
||||
* </body>
|
||||
* JQUERY
|
||||
* Methods
|
||||
* initializing: $("#mySearch").searchFilter([{text: "Field 1", value: "field1"},{text: "Field 2", value: "field2"}], {onSearch: myFilterRuleReceiverFn, onReset: myFilterResetFn });
|
||||
* Manual Methods (there's no need to call these methods unless you are trying to manipulate searchFilter with script)
|
||||
* add: $("#mySearch").searchFilter().add(); // appends a blank filter
|
||||
* $("#mySearch").searchFilter().add(0); // copies the first filter as second
|
||||
* del: $("#mySearch").searchFilter().del(); // removes the bottom filter
|
||||
* $("#mySearch").searchFilter().del(1); // removes the second filter
|
||||
* search: $("#mySearch").searchFilter().search(); // invokes onSearch, passing it a ruleGroup object
|
||||
* reset: $("#mySearch").searchFilter().reset(); // resets rules and invokes onReset
|
||||
* close: $("#mySearch").searchFilter().close(); // without an onClose handler, equivalent to $("#mySearch").hide();
|
||||
*
|
||||
* NOTE: You can get the jQuery object back from the SearchFilter object by chaining .$
|
||||
* Example
|
||||
* $("#mySearch").searchFilter().add().add().reset().$.hide();
|
||||
* Verbose Example
|
||||
* $("#mySearch") // gets jQuery object for the HTML element with id="mySearch"
|
||||
* .searchFilter() // gets the SearchFilter object for an existing search filter
|
||||
* .add() // adds a new filter to the end of the list
|
||||
* .add() // adds another new filter to the end of the list
|
||||
* .reset() // resets filters back to original state, triggers onReset
|
||||
* .$ // returns jQuery object for $("#mySearch")
|
||||
* .hide(); // equivalent to $("#mySearch").hide();
|
||||
*/
|
||||
|
||||
jQuery.fn.searchFilter = function(fields, options) {
|
||||
|
||||
function SearchFilter(jQ, fields, options) {
|
||||
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// PUBLIC VARS
|
||||
//---------------------------------------------------------------
|
||||
|
||||
this.$ = jQ; // makes the jQuery object available as .$ from the return value
|
||||
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// PUBLIC FUNCTIONS
|
||||
//---------------------------------------------------------------
|
||||
|
||||
this.add = function(i) {
|
||||
if (i == null) jQ.find(".ui-add-last").click();
|
||||
else jQ.find(".sf:eq(" + i + ") .ui-add").click();
|
||||
return this;
|
||||
};
|
||||
|
||||
this.del = function(i) {
|
||||
if (i == null) jQ.find(".sf:last .ui-del").click();
|
||||
else jQ.find(".sf:eq(" + i + ") .ui-del").click();
|
||||
return this;
|
||||
};
|
||||
|
||||
this.search = function(e) {
|
||||
jQ.find(".ui-search").click();
|
||||
return this;
|
||||
};
|
||||
|
||||
this.reset = function(o) {
|
||||
if(o===undefined) o = false;
|
||||
jQ.find(".ui-reset").trigger('click',[o]);
|
||||
return this;
|
||||
};
|
||||
|
||||
this.close = function() {
|
||||
jQ.find(".ui-closer").click();
|
||||
return this;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// "CONSTRUCTOR" (in air quotes)
|
||||
//---------------------------------------------------------------
|
||||
|
||||
if (fields != null) { // type coercion matches undefined as well as null
|
||||
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// UTILITY FUNCTIONS
|
||||
//---------------------------------------------------------------
|
||||
|
||||
function hover() {
|
||||
jQuery(this).toggleClass("ui-state-hover");
|
||||
return false;
|
||||
}
|
||||
|
||||
function active(e) {
|
||||
jQuery(this).toggleClass("ui-state-active", (e.type == "mousedown"));
|
||||
return false;
|
||||
}
|
||||
|
||||
function buildOpt(value, text) {
|
||||
return "<option value='" + value + "'>" + text + "</option>";
|
||||
}
|
||||
|
||||
function buildSel(className, options, isHidden) {
|
||||
return "<select class='" + className + "'" + (isHidden ? " style='display:none;'" : "") + ">" + options + "</select>";
|
||||
}
|
||||
|
||||
function initData(selector, fn) {
|
||||
var jElem = jQ.find("tr.sf td.data " + selector);
|
||||
if (jElem[0] != null)
|
||||
fn(jElem);
|
||||
}
|
||||
|
||||
function bindDataEvents(selector, events) {
|
||||
var jElem = jQ.find("tr.sf td.data " + selector);
|
||||
if (jElem[0] != null) {
|
||||
jQuery.each(events, function() {
|
||||
if (this.data != null)
|
||||
jElem.bind(this.type, this.data, this.fn);
|
||||
else
|
||||
jElem.bind(this.type, this.fn);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// SUPER IMPORTANT PRIVATE VARS
|
||||
//---------------------------------------------------------------
|
||||
|
||||
// copies jQuery.fn.searchFilter.defaults.options properties onto an empty object, then options onto that
|
||||
var opts = jQuery.extend({}, jQuery.fn.searchFilter.defaults, options);
|
||||
|
||||
// this is keeps track of the last asynchronous setup
|
||||
var highest_late_setup = -1;
|
||||
|
||||
|
||||
//---------------------------------------------------------------
|
||||
// CREATION PROCESS STARTS
|
||||
//---------------------------------------------------------------
|
||||
|
||||
// generate the global ops
|
||||
var gOps_html = "";
|
||||
jQuery.each(opts.groupOps, function() { gOps_html += buildOpt(this.op, this.text); });
|
||||
gOps_html = "<select name='groupOp'>" + gOps_html + "</select>";
|
||||
|
||||
/* original content - doesn't minify very well
|
||||
jQ
|
||||
.html("") // clear any old content
|
||||
.addClass("ui-searchFilter") // add classes
|
||||
.append( // add content
|
||||
"\
|
||||
<div class='ui-widget-overlay' style='z-index: -1'> </div>\
|
||||
<table class='ui-widget-content ui-corner-all'>\
|
||||
<thead>\
|
||||
<tr>\
|
||||
<td colspan='5' class='ui-widget-header ui-corner-all' style='line-height: 18px;'>\
|
||||
<div class='ui-closer ui-state-default ui-corner-all ui-helper-clearfix' style='float: right;'>\
|
||||
<span class='ui-icon ui-icon-close'></span>\
|
||||
</div>\
|
||||
" + opts.windowTitle + "\
|
||||
</td>\
|
||||
</tr>\
|
||||
</thead>\
|
||||
<tbody>\
|
||||
<tr class='sf'>\
|
||||
<td class='fields'></td>\
|
||||
<td class='ops'></td>\
|
||||
<td class='data'></td>\
|
||||
<td><div class='ui-del ui-state-default ui-corner-all'><span class='ui-icon ui-icon-minus'></span></div></td>\
|
||||
<td><div class='ui-add ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plus'></span></div></td>\
|
||||
</tr>\
|
||||
<tr>\
|
||||
<td colspan='5' class='divider'><div> </div></td>\
|
||||
</tr>\
|
||||
</tbody>\
|
||||
<tfoot>\
|
||||
<tr>\
|
||||
<td colspan='3'>\
|
||||
<span class='ui-reset ui-state-default ui-corner-all' style='display: inline-block; float: left;'><span class='ui-icon ui-icon-arrowreturnthick-1-w' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.resetText + "</span></span>\
|
||||
<span class='ui-search ui-state-default ui-corner-all' style='display: inline-block; float: right;'><span class='ui-icon ui-icon-search' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.searchText + "</span></span>\
|
||||
<span class='matchText'>" + opts.matchText + "</span> \
|
||||
" + gOps_html + " \
|
||||
<span class='rulesText'>" + opts.rulesText + "</span>\
|
||||
</td>\
|
||||
<td> </td>\
|
||||
<td><div class='ui-add-last ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plusthick'></span></div></td>\
|
||||
</tr>\
|
||||
</tfoot>\
|
||||
</table>\
|
||||
");
|
||||
/* end hard-to-minify code */
|
||||
/* begin easier to minify code */
|
||||
jQ.html("").addClass("ui-searchFilter").append("<div class='ui-widget-overlay' style='z-index: -1'> </div><table class='ui-widget-content ui-corner-all'><thead><tr><td colspan='5' class='ui-widget-header ui-corner-all' style='line-height: 18px;'><div class='ui-closer ui-state-default ui-corner-all ui-helper-clearfix' style='float: right;'><span class='ui-icon ui-icon-close'></span></div>" + opts.windowTitle + "</td></tr></thead><tbody><tr class='sf'><td class='fields'></td><td class='ops'></td><td class='data'></td><td><div class='ui-del ui-state-default ui-corner-all'><span class='ui-icon ui-icon-minus'></span></div></td><td><div class='ui-add ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plus'></span></div></td></tr><tr><td colspan='5' class='divider'><hr class='ui-widget-content' style='margin:1px'/></td></tr></tbody><tfoot><tr><td colspan='3'><span class='ui-reset ui-state-default ui-corner-all' style='display: inline-block; float: left;'><span class='ui-icon ui-icon-arrowreturnthick-1-w' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.resetText + "</span></span><span class='ui-search ui-state-default ui-corner-all' style='display: inline-block; float: right;'><span class='ui-icon ui-icon-search' style='float: left;'></span><span style='line-height: 18px; padding: 0 7px 0 3px;'>" + opts.searchText + "</span></span><span class='matchText'>" + opts.matchText + "</span> " + gOps_html + " <span class='rulesText'>" + opts.rulesText + "</span></td><td> </td><td><div class='ui-add-last ui-state-default ui-corner-all'><span class='ui-icon ui-icon-plusthick'></span></div></td></tr></tfoot></table>");
|
||||
/* end easier-to-minify code */
|
||||
|
||||
var jRow = jQ.find("tr.sf");
|
||||
var jFields = jRow.find("td.fields");
|
||||
var jOps = jRow.find("td.ops");
|
||||
var jData = jRow.find("td.data");
|
||||
|
||||
// generate the defaults
|
||||
var default_ops_html = "";
|
||||
jQuery.each(opts.operators, function() { default_ops_html += buildOpt(this.op, this.text); });
|
||||
default_ops_html = buildSel("default", default_ops_html, true);
|
||||
jOps.append(default_ops_html);
|
||||
var default_data_html = "<input type='text' class='default' style='display:none;' />";
|
||||
jData.append(default_data_html);
|
||||
|
||||
// generate the field list as a string
|
||||
var fields_html = "";
|
||||
var has_custom_ops = false;
|
||||
var has_custom_data = false;
|
||||
jQuery.each(fields, function(i) {
|
||||
var field_num = i;
|
||||
fields_html += buildOpt(this.itemval, this.text);
|
||||
// add custom ops if they exist
|
||||
if (this.ops != null) {
|
||||
has_custom_ops = true;
|
||||
var custom_ops = "";
|
||||
jQuery.each(this.ops, function() { custom_ops += buildOpt(this.op, this.text); });
|
||||
custom_ops = buildSel("field" + field_num, custom_ops, true);
|
||||
jOps.append(custom_ops);
|
||||
}
|
||||
// add custom data if it is given
|
||||
if (this.dataUrl != null) {
|
||||
if (i > highest_late_setup) highest_late_setup = i;
|
||||
has_custom_data = true;
|
||||
var dEvents = this.dataEvents;
|
||||
var iEvent = this.dataInit;
|
||||
var bs = this.buildSelect;
|
||||
jQuery.ajax(jQuery.extend({
|
||||
url : this.dataUrl,
|
||||
complete: function(data) {
|
||||
var $d;
|
||||
if(bs != null) $d =jQuery("<div />").append(bs(data));
|
||||
else $d = jQuery("<div />").append(data.responseText);
|
||||
$d.find("select").addClass("field" + field_num).hide();
|
||||
jData.append($d.html());
|
||||
if (iEvent) initData(".field" + i, iEvent);
|
||||
if (dEvents) bindDataEvents(".field" + i, dEvents);
|
||||
if (i == highest_late_setup) { // change should get called no more than twice when this searchFilter is constructed
|
||||
jQ.find("tr.sf td.fields select[name='field']").change();
|
||||
}
|
||||
}
|
||||
},opts.ajaxSelectOptions));
|
||||
} else if (this.dataValues != null) {
|
||||
has_custom_data = true;
|
||||
var custom_data = "";
|
||||
jQuery.each(this.dataValues, function() { custom_data += buildOpt(this.value, this.text); });
|
||||
custom_data = buildSel("field" + field_num, custom_data, true);
|
||||
jData.append(custom_data);
|
||||
} else if (this.dataEvents != null || this.dataInit != null) {
|
||||
has_custom_data = true;
|
||||
var custom_data = "<input type='text' class='field" + field_num + "' />";
|
||||
jData.append(custom_data);
|
||||
}
|
||||
// attach events to data if they exist
|
||||
if (this.dataInit != null && i != highest_late_setup)
|
||||
initData(".field" + i, this.dataInit);
|
||||
if (this.dataEvents != null && i != highest_late_setup)
|
||||
bindDataEvents(".field" + i, this.dataEvents);
|
||||
});
|
||||
fields_html = "<select name='field'>" + fields_html + "</select>";
|
||||
jFields.append(fields_html);
|
||||
|
||||
// setup the field select with an on-change event if there are custom ops or data
|
||||
var jFSelect = jFields.find("select[name='field']");
|
||||
if (has_custom_ops) jFSelect.change(function(e) {
|
||||
var index = e.target.selectedIndex;
|
||||
var td = jQuery(e.target).parents("tr.sf").find("td.ops");
|
||||
td.find("select").removeAttr("name").hide(); // disown and hide all elements
|
||||
var jElem = td.find(".field" + index);
|
||||
if (jElem[0] == null) jElem = td.find(".default"); // if there's not an element for that field, use the default one
|
||||
jElem.attr("name", "op").show();
|
||||
return false;
|
||||
});
|
||||
else jOps.find(".default").attr("name", "op").show();
|
||||
if (has_custom_data) jFSelect.change(function(e) {
|
||||
var index = e.target.selectedIndex;
|
||||
var td = jQuery(e.target).parents("tr.sf").find("td.data");
|
||||
td.find("select,input").removeClass("vdata").hide(); // disown and hide all elements
|
||||
var jElem = td.find(".field" + index);
|
||||
if (jElem[0] == null) jElem = td.find(".default"); // if there's not an element for that field, use the default one
|
||||
jElem.show().addClass("vdata");
|
||||
return false;
|
||||
});
|
||||
else jData.find(".default").show().addClass("vdata");
|
||||
// go ahead and call the change event and setup the ops and data values
|
||||
if (has_custom_ops || has_custom_data) jFSelect.change();
|
||||
|
||||
// bind events
|
||||
jQ.find(".ui-state-default").hover(hover, hover).mousedown(active).mouseup(active); // add hover/active effects to all buttons
|
||||
jQ.find(".ui-closer").click(function(e) {
|
||||
opts.onClose(jQuery(jQ.selector));
|
||||
return false;
|
||||
});
|
||||
jQ.find(".ui-del").click(function(e) {
|
||||
var row = jQuery(e.target).parents(".sf");
|
||||
if (row.siblings(".sf").length > 0) { // doesn't remove if there's only one filter left
|
||||
if (opts.datepickerFix === true && jQuery.fn.datepicker !== undefined)
|
||||
row.find(".hasDatepicker").datepicker("destroy"); // clean up datepicker's $.data mess
|
||||
row.remove(); // also unbinds
|
||||
} else { // resets the filter if it's the last one
|
||||
row.find("select[name='field']")[0].selectedIndex = 0;
|
||||
row.find("select[name='op']")[0].selectedIndex = 0;
|
||||
row.find(".data input").val(""); // blank all input values
|
||||
row.find(".data select").each(function() { this.selectedIndex = 0; }); // select first option on all selects
|
||||
row.find("select[name='field']").change(function(event){event.stopPropagation();}); // trigger any change events
|
||||
}
|
||||
return false;
|
||||
});
|
||||
jQ.find(".ui-add").click(function(e) {
|
||||
var row = jQuery(e.target).parents(".sf");
|
||||
var newRow = row.clone(true).insertAfter(row);
|
||||
newRow.find(".ui-state-default").removeClass("ui-state-hover ui-state-active");
|
||||
if (opts.clone) {
|
||||
newRow.find("select[name='field']")[0].selectedIndex = row.find("select[name='field']")[0].selectedIndex;
|
||||
var stupid_browser = (newRow.find("select[name='op']")[0] == null); // true for IE6
|
||||
if (!stupid_browser)
|
||||
newRow.find("select[name='op']").focus()[0].selectedIndex = row.find("select[name='op']")[0].selectedIndex;
|
||||
var jElem = newRow.find("select.vdata");
|
||||
if (jElem[0] != null) // select doesn't copy it's selected index when cloned
|
||||
jElem[0].selectedIndex = row.find("select.vdata")[0].selectedIndex;
|
||||
} else {
|
||||
newRow.find(".data input").val(""); // blank all input values
|
||||
newRow.find("select[name='field']").focus();
|
||||
}
|
||||
if (opts.datepickerFix === true && jQuery.fn.datepicker !== undefined) { // using $.data to associate data with document elements is Not Good
|
||||
row.find(".hasDatepicker").each(function() {
|
||||
var settings = $(this).data("datepicker").settings;
|
||||
newRow.find("#" + this.id).unbind().removeAttr("id").removeClass("hasDatepicker").datepicker(settings);
|
||||
});
|
||||
}
|
||||
newRow.find("select[name='field']").change(function(event){event.stopPropagation();} );
|
||||
return false;
|
||||
});
|
||||
jQ.find(".ui-search").click(function(e) {
|
||||
var ui = jQuery(jQ.selector); // pointer to search box wrapper element
|
||||
var ruleGroup;
|
||||
var group_op = ui.find("select[name='groupOp'] :selected").val(); // puls "AND" or "OR"
|
||||
if (!opts.stringResult) {
|
||||
ruleGroup = {
|
||||
groupOp: group_op,
|
||||
rules: []
|
||||
};
|
||||
} else {
|
||||
ruleGroup = "{\"groupOp\":\"" + group_op + "\",\"rules\":[";
|
||||
}
|
||||
ui.find(".sf").each(function(i) {
|
||||
var tField = jQuery(this).find("select[name='field'] :selected").val();
|
||||
var tOp = jQuery(this).find("select[name='op'] :selected").val();
|
||||
var tData = jQuery(this).find("input.vdata,select.vdata :selected").val();
|
||||
tData += "";
|
||||
if (!opts.stringResult) {
|
||||
ruleGroup.rules.push({
|
||||
field: tField,
|
||||
op: tOp,
|
||||
data: tData
|
||||
});
|
||||
} else {
|
||||
tData = tData.replace(/\\/g,'\\\\').replace(/\"/g,'\\"');
|
||||
if (i > 0) ruleGroup += ",";
|
||||
ruleGroup += "{\"field\":\"" + tField + "\",";
|
||||
ruleGroup += "\"op\":\"" + tOp + "\",";
|
||||
ruleGroup += "\"data\":\"" + tData + "\"}";
|
||||
}
|
||||
});
|
||||
if (opts.stringResult) ruleGroup += "]}";
|
||||
opts.onSearch(ruleGroup);
|
||||
return false;
|
||||
});
|
||||
jQ.find(".ui-reset").click(function(e,op) {
|
||||
var ui = jQuery(jQ.selector);
|
||||
ui.find(".ui-del").click(); // removes all filters, resets the last one
|
||||
ui.find("select[name='groupOp']")[0].selectedIndex = 0; // changes the op back to the default one
|
||||
opts.onReset(op);
|
||||
return false;
|
||||
});
|
||||
jQ.find(".ui-add-last").click(function() {
|
||||
var row = jQuery(jQ.selector + " .sf:last");
|
||||
var newRow = row.clone(true).insertAfter(row);
|
||||
newRow.find(".ui-state-default").removeClass("ui-state-hover ui-state-active");
|
||||
newRow.find(".data input").val(""); // blank all input values
|
||||
newRow.find("select[name='field']").focus();
|
||||
if (opts.datepickerFix === true && jQuery.fn.datepicker !== undefined) { // using $.data to associate data with document elements is Not Good
|
||||
row.find(".hasDatepicker").each(function() {
|
||||
var settings = $(this).data("datepicker").settings;
|
||||
newRow.find("#" + this.id).unbind().removeAttr("id").removeClass("hasDatepicker").datepicker(settings);
|
||||
});
|
||||
}
|
||||
newRow.find("select[name='field']").change(function(event){event.stopPropagation();});
|
||||
return false;
|
||||
});
|
||||
|
||||
this.setGroupOp = function(setting) {
|
||||
/* a "setter" for groupping argument.
|
||||
* ("AND" or "OR")
|
||||
*
|
||||
* Inputs:
|
||||
* setting - a string
|
||||
*
|
||||
* Returns:
|
||||
* Does not return anything. May add success / failure reporting in future versions.
|
||||
*
|
||||
* author: Daniel Dotsenko (dotsa@hotmail.com)
|
||||
*/
|
||||
selDOMobj = jQ.find("select[name='groupOp']")[0];
|
||||
var indexmap = {}, l = selDOMobj.options.length, i;
|
||||
for (i=0; i<l; i++) {
|
||||
indexmap[selDOMobj.options[i].value] = i;
|
||||
}
|
||||
selDOMobj.selectedIndex = indexmap[setting];
|
||||
jQuery(selDOMobj).change(function(event){event.stopPropagation();});
|
||||
};
|
||||
|
||||
this.setFilter = function(settings) {
|
||||
/* a "setter" for an arbitrary SearchFilter's filter line.
|
||||
* designed to abstract the DOM manipulations required to infer
|
||||
* a particular filter is a fit to the search box.
|
||||
*
|
||||
* Inputs:
|
||||
* settings - an "object" (dictionary)
|
||||
* index (optional*) (to be implemented in the future) : signed integer index (from top to bottom per DOM) of the filter line to fill.
|
||||
* Negative integers (rooted in -1 and lower) denote position of the line from the bottom.
|
||||
* sfref (optional*) : DOM object referencing individual '.sf' (normally a TR element) to be populated. (optional)
|
||||
* filter (mandatory) : object (dictionary) of form {'field':'field_value','op':'op_value','data':'data value'}
|
||||
*
|
||||
* * It is mandatory to have either index or sfref defined.
|
||||
*
|
||||
* Returns:
|
||||
* Does not return anything. May add success / failure reporting in future versions.
|
||||
*
|
||||
* author: Daniel Dotsenko (dotsa@hotmail.com)
|
||||
*/
|
||||
|
||||
var o = settings['sfref'], filter = settings['filter'];
|
||||
|
||||
// setting up valueindexmap that we will need to manipulate SELECT elements.
|
||||
var fields = [], i, j , l, lj, li,
|
||||
valueindexmap = {};
|
||||
// example of valueindexmap:
|
||||
// {'field1':{'index':0,'ops':{'eq':0,'ne':1}},'fieldX':{'index':1,'ops':{'eq':0,'ne':1},'data':{'true':0,'false':1}}},
|
||||
// if data is undefined it's a INPUT field. If defined, it's SELECT
|
||||
selDOMobj = o.find("select[name='field']")[0];
|
||||
for (i=0, l=selDOMobj.options.length; i<l; i++) {
|
||||
valueindexmap[selDOMobj.options[i].value] = {'index':i,'ops':{}};
|
||||
fields.push(selDOMobj.options[i].value);
|
||||
}
|
||||
for (i=0, li=fields.length; i < li; i++) {
|
||||
selDOMobj = o.find(".ops > select[class='field"+i+"']")[0];
|
||||
if (selDOMobj) {
|
||||
for (j=0, lj=selDOMobj.options.length; j<lj; j++) {
|
||||
valueindexmap[fields[i]]['ops'][selDOMobj.options[j].value] = j;
|
||||
}
|
||||
}
|
||||
selDOMobj = o.find(".data > select[class='field"+i+"']")[0];
|
||||
if (selDOMobj) {
|
||||
valueindexmap[fields[i]]['data'] = {}; // this setting is the flag that 'data' is contained in a SELECT
|
||||
for (j=0, lj=selDOMobj.options.length; j<lj; j++) {
|
||||
valueindexmap[fields[i]]['data'][selDOMobj.options[j].value] = j;
|
||||
}
|
||||
}
|
||||
} // done populating valueindexmap
|
||||
|
||||
// preparsing the index values for SELECT elements.
|
||||
var fieldvalue, fieldindex, opindex, datavalue, dataindex;
|
||||
fieldvalue = filter['field'];
|
||||
if (valueindexmap[fieldvalue]) {
|
||||
fieldindex = valueindexmap[fieldvalue]['index'];
|
||||
}
|
||||
if (fieldindex != null) {
|
||||
opindex = valueindexmap[fieldvalue]['ops'][filter['op']];
|
||||
if(opindex === undefined) {
|
||||
for(i=0,li=options.operators.length; i<li;i++) {
|
||||
if(options.operators[i].op == filter.op ){
|
||||
opindex = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
datavalue = filter['data'];
|
||||
if (valueindexmap[fieldvalue]['data'] == null) {
|
||||
dataindex = -1; // 'data' is not SELECT, Making the var 'defined'
|
||||
} else {
|
||||
dataindex = valueindexmap[fieldvalue]['data'][datavalue]; // 'undefined' may come from here.
|
||||
}
|
||||
}
|
||||
// only if values for 'field' and 'op' and 'data' are 'found' in mapping...
|
||||
if (fieldindex != null && opindex != null && dataindex != null) {
|
||||
o.find("select[name='field']")[0].selectedIndex = fieldindex;
|
||||
o.find("select[name='field']").change();
|
||||
o.find("select[name='op']")[0].selectedIndex = opindex;
|
||||
o.find("input.vdata").val(datavalue); // if jquery does not find any INPUT, it does not set any. This means we deal with SELECT
|
||||
o = o.find("select.vdata")[0];
|
||||
if (o) {
|
||||
o.selectedIndex = dataindex;
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}; // end of this.setFilter fn
|
||||
} // end of if fields != null
|
||||
}
|
||||
return new SearchFilter(this, fields, options);
|
||||
};
|
||||
|
||||
jQuery.fn.searchFilter.version = '1.2.9';
|
||||
|
||||
/* This property contains the default options */
|
||||
jQuery.fn.searchFilter.defaults = {
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: boolean
|
||||
* DESCRIPTION: clone a row if it is added from an existing row
|
||||
* when false, any new added rows will be blank.
|
||||
*/
|
||||
clone: true,
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: boolean
|
||||
* DESCRIPTION: current version of datepicker uses a data store,
|
||||
* which is incompatible with $().clone(true)
|
||||
*/
|
||||
datepickerFix: true,
|
||||
|
||||
/*
|
||||
* FUNCTION
|
||||
* DESCRIPTION: the function that will be called when the user clicks Reset
|
||||
* INPUT TYPE: JS object if stringResult is false, otherwise is JSON string
|
||||
*/
|
||||
onReset: function(data) { alert("Reset Clicked. Data Returned: " + data) },
|
||||
|
||||
/*
|
||||
* FUNCTION
|
||||
* DESCRIPTION: the function that will be called when the user clicks Search
|
||||
* INPUT TYPE: JS object if stringResult is false, otherwise is JSON string
|
||||
*/
|
||||
onSearch: function(data) { alert("Search Clicked. Data Returned: " + data) },
|
||||
|
||||
/*
|
||||
* FUNCTION
|
||||
* DESCRIPTION: the function that will be called when the user clicks the Closer icon
|
||||
* or the close() function is called
|
||||
* if left null, it simply does a .hide() on the searchFilter
|
||||
* INPUT TYPE: a jQuery object for the searchFilter
|
||||
*/
|
||||
onClose: function(jElem) { jElem.hide(); },
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: array of objects, each object has the properties op and text
|
||||
* DESCRIPTION: the selectable operators that are applied between rules
|
||||
* e.g. for {op:"AND", text:"all"}
|
||||
* the search filter box will say: match all rules
|
||||
* the server should interpret this as putting the AND op between each rule:
|
||||
* rule1 AND rule2 AND rule3
|
||||
* text will be the option text, and op will be the option value
|
||||
*/
|
||||
groupOps: [
|
||||
{ op: "AND", text: "all" },
|
||||
{ op: "OR", text: "any" }
|
||||
],
|
||||
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: array of objects, each object has the properties op and text
|
||||
* DESCRIPTION: the operators that will appear as drop-down options
|
||||
* text will be the option text, and op will be the option value
|
||||
*/
|
||||
operators: [
|
||||
{ op: "eq", text: "is equal to" },
|
||||
{ op: "ne", text: "is not equal to" },
|
||||
{ op: "lt", text: "is less than" },
|
||||
{ op: "le", text: "is less or equal to" },
|
||||
{ op: "gt", text: "is greater than" },
|
||||
{ op: "ge", text: "is greater or equal to" },
|
||||
{ op: "in", text: "is in" },
|
||||
{ op: "ni", text: "is not in" },
|
||||
{ op: "bw", text: "begins with" },
|
||||
{ op: "bn", text: "does not begin with" },
|
||||
{ op: "ew", text: "ends with" },
|
||||
{ op: "en", text: "does not end with" },
|
||||
{ op: "cn", text: "contains" },
|
||||
{ op: "nc", text: "does not contain" }
|
||||
],
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: string
|
||||
* DESCRIPTION: part of the phrase: _match_ ANY/ALL rules
|
||||
*/
|
||||
matchText: "match",
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: string
|
||||
* DESCRIPTION: part of the phrase: match ANY/ALL _rules_
|
||||
*/
|
||||
rulesText: "rules",
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: string
|
||||
* DESCRIPTION: the text that will be displayed in the reset button
|
||||
*/
|
||||
resetText: "Reset",
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: string
|
||||
* DESCRIPTION: the text that will be displayed in the search button
|
||||
*/
|
||||
searchText: "Search",
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: boolean
|
||||
* DESCRIPTION: a flag that, when set, will make the onSearch and onReset return strings instead of objects
|
||||
*/
|
||||
stringResult: true,
|
||||
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: string
|
||||
* DESCRIPTION: the title of the searchFilter window
|
||||
*/
|
||||
windowTitle: "Search Rules",
|
||||
/*
|
||||
* PROPERTY
|
||||
* TYPE: object
|
||||
* DESCRIPTION: options to extend the ajax request
|
||||
*/
|
||||
ajaxSelectOptions : {}
|
||||
}; /* end of searchFilter */
|
||||
@@ -0,0 +1,388 @@
|
||||
/**
|
||||
* TableDnD plug-in for JQuery, allows you to drag and drop table rows
|
||||
* You can set up various options to control how the system will work
|
||||
* Copyright (c) Denis Howlett <denish@isocra.com>
|
||||
* Licensed like jQuery, see http://docs.jquery.com/License.
|
||||
*
|
||||
* Configuration options:
|
||||
*
|
||||
* onDragStyle
|
||||
* This is the style that is assigned to the row during drag. There are limitations to the styles that can be
|
||||
* associated with a row (such as you can't assign a border--well you can, but it won't be
|
||||
* displayed). (So instead consider using onDragClass.) The CSS style to apply is specified as
|
||||
* a map (as used in the jQuery css(...) function).
|
||||
* onDropStyle
|
||||
* This is the style that is assigned to the row when it is dropped. As for onDragStyle, there are limitations
|
||||
* to what you can do. Also this replaces the original style, so again consider using onDragClass which
|
||||
* is simply added and then removed on drop.
|
||||
* onDragClass
|
||||
* This class is added for the duration of the drag and then removed when the row is dropped. It is more
|
||||
* flexible than using onDragStyle since it can be inherited by the row cells and other content. The default
|
||||
* is class is tDnD_whileDrag. So to use the default, simply customise this CSS class in your
|
||||
* stylesheet.
|
||||
* onDrop
|
||||
* Pass a function that will be called when the row is dropped. The function takes 2 parameters: the table
|
||||
* and the row that was dropped. You can work out the new order of the rows by using
|
||||
* table.rows.
|
||||
* onDragStart
|
||||
* Pass a function that will be called when the user starts dragging. The function takes 2 parameters: the
|
||||
* table and the row which the user has started to drag.
|
||||
* onAllowDrop
|
||||
* Pass a function that will be called as a row is over another row. If the function returns true, allow
|
||||
* dropping on that row, otherwise not. The function takes 2 parameters: the dragged row and the row under
|
||||
* the cursor. It returns a boolean: true allows the drop, false doesn't allow it.
|
||||
* scrollAmount
|
||||
* This is the number of pixels to scroll if the user moves the mouse cursor to the top or bottom of the
|
||||
* window. The page should automatically scroll up or down as appropriate (tested in IE6, IE7, Safari, FF2,
|
||||
* FF3 beta
|
||||
* dragHandle
|
||||
* This is the name of a class that you assign to one or more cells in each row that is draggable. If you
|
||||
* specify this class, then you are responsible for setting cursor: move in the CSS and only these cells
|
||||
* will have the drag behaviour. If you do not specify a dragHandle, then you get the old behaviour where
|
||||
* the whole row is draggable.
|
||||
*
|
||||
* Other ways to control behaviour:
|
||||
*
|
||||
* Add class="nodrop" to any rows for which you don't want to allow dropping, and class="nodrag" to any rows
|
||||
* that you don't want to be draggable.
|
||||
*
|
||||
* Inside the onDrop method you can also call $.tableDnD.serialize() this returns a string of the form
|
||||
* <tableID>[]=<rowID1>&<tableID>[]=<rowID2> so that you can send this back to the server. The table must have
|
||||
* an ID as must all the rows.
|
||||
*
|
||||
* Other methods:
|
||||
*
|
||||
* $("...").tableDnDUpdate()
|
||||
* Will update all the matching tables, that is it will reapply the mousedown method to the rows (or handle cells).
|
||||
* This is useful if you have updated the table rows using Ajax and you want to make the table draggable again.
|
||||
* The table maintains the original configuration (so you don't have to specify it again).
|
||||
*
|
||||
* $("...").tableDnDSerialize()
|
||||
* Will serialize and return the serialized string as above, but for each of the matching tables--so it can be
|
||||
* called from anywhere and isn't dependent on the currentTable being set up correctly before calling
|
||||
*
|
||||
* Known problems:
|
||||
* - Auto-scoll has some problems with IE7 (it scrolls even when it shouldn't), work-around: set scrollAmount to 0
|
||||
*
|
||||
* Version 0.2: 2008-02-20 First public version
|
||||
* Version 0.3: 2008-02-07 Added onDragStart option
|
||||
* Made the scroll amount configurable (default is 5 as before)
|
||||
* Version 0.4: 2008-03-15 Changed the noDrag/noDrop attributes to nodrag/nodrop classes
|
||||
* Added onAllowDrop to control dropping
|
||||
* Fixed a bug which meant that you couldn't set the scroll amount in both directions
|
||||
* Added serialize method
|
||||
* Version 0.5: 2008-05-16 Changed so that if you specify a dragHandle class it doesn't make the whole row
|
||||
* draggable
|
||||
* Improved the serialize method to use a default (and settable) regular expression.
|
||||
* Added tableDnDupate() and tableDnDSerialize() to be called when you are outside the table
|
||||
*/
|
||||
jQuery.tableDnD = {
|
||||
/** Keep hold of the current table being dragged */
|
||||
currentTable : null,
|
||||
/** Keep hold of the current drag object if any */
|
||||
dragObject: null,
|
||||
/** The current mouse offset */
|
||||
mouseOffset: null,
|
||||
/** Remember the old value of Y so that we don't do too much processing */
|
||||
oldY: 0,
|
||||
|
||||
/** Actually build the structure */
|
||||
build: function(options) {
|
||||
// Set up the defaults if any
|
||||
|
||||
this.each(function() {
|
||||
// This is bound to each matching table, set up the defaults and override with user options
|
||||
this.tableDnDConfig = jQuery.extend({
|
||||
onDragStyle: null,
|
||||
onDropStyle: null,
|
||||
// Add in the default class for whileDragging
|
||||
onDragClass: "tDnD_whileDrag",
|
||||
onDrop: null,
|
||||
onDragStart: null,
|
||||
scrollAmount: 5,
|
||||
serializeRegexp: /[^\-]*$/, // The regular expression to use to trim row IDs
|
||||
serializeParamName: null, // If you want to specify another parameter name instead of the table ID
|
||||
dragHandle: null // If you give the name of a class here, then only Cells with this class will be draggable
|
||||
}, options || {});
|
||||
// Now make the rows draggable
|
||||
jQuery.tableDnD.makeDraggable(this);
|
||||
});
|
||||
|
||||
// Now we need to capture the mouse up and mouse move event
|
||||
// We can use bind so that we don't interfere with other event handlers
|
||||
jQuery(document)
|
||||
.bind('mousemove', jQuery.tableDnD.mousemove)
|
||||
.bind('mouseup', jQuery.tableDnD.mouseup);
|
||||
|
||||
// Don't break the chain
|
||||
return this;
|
||||
},
|
||||
|
||||
/** This function makes all the rows on the table draggable apart from those marked as "NoDrag" */
|
||||
makeDraggable: function(table) {
|
||||
var config = table.tableDnDConfig;
|
||||
if (table.tableDnDConfig.dragHandle) {
|
||||
// We only need to add the event to the specified cells
|
||||
var cells = jQuery("td."+table.tableDnDConfig.dragHandle, table);
|
||||
cells.each(function() {
|
||||
// The cell is bound to "this"
|
||||
jQuery(this).mousedown(function(ev) {
|
||||
jQuery.tableDnD.dragObject = this.parentNode;
|
||||
jQuery.tableDnD.currentTable = table;
|
||||
jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev);
|
||||
if (config.onDragStart) {
|
||||
// Call the onDrop method if there is one
|
||||
config.onDragStart(table, this);
|
||||
}
|
||||
return false;
|
||||
});
|
||||
})
|
||||
} else {
|
||||
// For backwards compatibility, we add the event to the whole row
|
||||
var rows = jQuery("tr", table); // get all the rows as a wrapped set
|
||||
rows.each(function() {
|
||||
// Iterate through each row, the row is bound to "this"
|
||||
var row = jQuery(this);
|
||||
if (! row.hasClass("nodrag")) {
|
||||
row.mousedown(function(ev) {
|
||||
if (ev.target.tagName == "TD") {
|
||||
jQuery.tableDnD.dragObject = this;
|
||||
jQuery.tableDnD.currentTable = table;
|
||||
jQuery.tableDnD.mouseOffset = jQuery.tableDnD.getMouseOffset(this, ev);
|
||||
if (config.onDragStart) {
|
||||
// Call the onDrop method if there is one
|
||||
config.onDragStart(table, this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}).css("cursor", "move"); // Store the tableDnD object
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
updateTables: function() {
|
||||
this.each(function() {
|
||||
// this is now bound to each matching table
|
||||
if (this.tableDnDConfig) {
|
||||
jQuery.tableDnD.makeDraggable(this);
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
/** Get the mouse coordinates from the event (allowing for browser differences) */
|
||||
mouseCoords: function(ev){
|
||||
if(ev.pageX || ev.pageY){
|
||||
return {x:ev.pageX, y:ev.pageY};
|
||||
}
|
||||
return {
|
||||
x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
|
||||
y:ev.clientY + document.body.scrollTop - document.body.clientTop
|
||||
};
|
||||
},
|
||||
|
||||
/** Given a target element and a mouse event, get the mouse offset from that element.
|
||||
To do this we need the element's position and the mouse position */
|
||||
getMouseOffset: function(target, ev) {
|
||||
ev = ev || window.event;
|
||||
|
||||
var docPos = this.getPosition(target);
|
||||
var mousePos = this.mouseCoords(ev);
|
||||
return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
|
||||
},
|
||||
|
||||
/** Get the position of an element by going up the DOM tree and adding up all the offsets */
|
||||
getPosition: function(e){
|
||||
var left = 0;
|
||||
var top = 0;
|
||||
/** Safari fix -- thanks to Luis Chato for this! */
|
||||
if (e.offsetHeight == 0) {
|
||||
/** Safari 2 doesn't correctly grab the offsetTop of a table row
|
||||
this is detailed here:
|
||||
http://jacob.peargrove.com/blog/2006/technical/table-row-offsettop-bug-in-safari/
|
||||
the solution is likewise noted there, grab the offset of a table cell in the row - the firstChild.
|
||||
note that firefox will return a text node as a first child, so designing a more thorough
|
||||
solution may need to take that into account, for now this seems to work in firefox, safari, ie */
|
||||
e = e.firstChild; // a table cell
|
||||
}
|
||||
if (e && e.offsetParent) {
|
||||
while (e.offsetParent){
|
||||
left += e.offsetLeft;
|
||||
top += e.offsetTop;
|
||||
e = e.offsetParent;
|
||||
}
|
||||
|
||||
left += e.offsetLeft;
|
||||
top += e.offsetTop;
|
||||
}
|
||||
|
||||
return {x:left, y:top};
|
||||
},
|
||||
|
||||
mousemove: function(ev) {
|
||||
if (jQuery.tableDnD.dragObject == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
var dragObj = jQuery(jQuery.tableDnD.dragObject);
|
||||
var config = jQuery.tableDnD.currentTable.tableDnDConfig;
|
||||
var mousePos = jQuery.tableDnD.mouseCoords(ev);
|
||||
var y = mousePos.y - jQuery.tableDnD.mouseOffset.y;
|
||||
//auto scroll the window
|
||||
var yOffset = window.pageYOffset;
|
||||
if (document.all) {
|
||||
// Windows version
|
||||
//yOffset=document.body.scrollTop;
|
||||
if (typeof document.compatMode != 'undefined' &&
|
||||
document.compatMode != 'BackCompat') {
|
||||
yOffset = document.documentElement.scrollTop;
|
||||
}
|
||||
else if (typeof document.body != 'undefined') {
|
||||
yOffset=document.body.scrollTop;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (mousePos.y-yOffset < config.scrollAmount) {
|
||||
window.scrollBy(0, -config.scrollAmount);
|
||||
} else {
|
||||
var windowHeight = window.innerHeight ? window.innerHeight
|
||||
: document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.clientHeight;
|
||||
if (windowHeight-(mousePos.y-yOffset) < config.scrollAmount) {
|
||||
window.scrollBy(0, config.scrollAmount);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (y != jQuery.tableDnD.oldY) {
|
||||
// work out if we're going up or down...
|
||||
var movingDown = y > jQuery.tableDnD.oldY;
|
||||
// update the old value
|
||||
jQuery.tableDnD.oldY = y;
|
||||
// update the style to show we're dragging
|
||||
if (config.onDragClass) {
|
||||
dragObj.addClass(config.onDragClass);
|
||||
} else {
|
||||
dragObj.css(config.onDragStyle);
|
||||
}
|
||||
// If we're over a row then move the dragged row to there so that the user sees the
|
||||
// effect dynamically
|
||||
var currentRow = jQuery.tableDnD.findDropTargetRow(dragObj, y);
|
||||
if (currentRow) {
|
||||
// TODO worry about what happens when there are multiple TBODIES
|
||||
if (movingDown && jQuery.tableDnD.dragObject != currentRow) {
|
||||
jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow.nextSibling);
|
||||
} else if (! movingDown && jQuery.tableDnD.dragObject != currentRow) {
|
||||
jQuery.tableDnD.dragObject.parentNode.insertBefore(jQuery.tableDnD.dragObject, currentRow);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
|
||||
/** We're only worried about the y position really, because we can only move rows up and down */
|
||||
findDropTargetRow: function(draggedRow, y) {
|
||||
var rows = jQuery.tableDnD.currentTable.rows;
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
var row = rows[i];
|
||||
var rowY = this.getPosition(row).y;
|
||||
var rowHeight = parseInt(row.offsetHeight)/2;
|
||||
if (row.offsetHeight == 0) {
|
||||
rowY = this.getPosition(row.firstChild).y;
|
||||
rowHeight = parseInt(row.firstChild.offsetHeight)/2;
|
||||
}
|
||||
// Because we always have to insert before, we need to offset the height a bit
|
||||
if ((y > rowY - rowHeight) && (y < (rowY + rowHeight))) {
|
||||
// that's the row we're over
|
||||
// If it's the same as the current row, ignore it
|
||||
if (row == draggedRow) {return null;}
|
||||
var config = jQuery.tableDnD.currentTable.tableDnDConfig;
|
||||
if (config.onAllowDrop) {
|
||||
if (config.onAllowDrop(draggedRow, row)) {
|
||||
return row;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
} else {
|
||||
// If a row has nodrop class, then don't allow dropping (inspired by John Tarr and Famic)
|
||||
var nodrop = jQuery(row).hasClass("nodrop");
|
||||
if (! nodrop) {
|
||||
return row;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return row;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
mouseup: function(e) {
|
||||
if (jQuery.tableDnD.currentTable && jQuery.tableDnD.dragObject) {
|
||||
var droppedRow = jQuery.tableDnD.dragObject;
|
||||
var config = jQuery.tableDnD.currentTable.tableDnDConfig;
|
||||
// If we have a dragObject, then we need to release it,
|
||||
// The row will already have been moved to the right place so we just reset stuff
|
||||
if (config.onDragClass) {
|
||||
jQuery(droppedRow).removeClass(config.onDragClass);
|
||||
} else {
|
||||
jQuery(droppedRow).css(config.onDropStyle);
|
||||
}
|
||||
jQuery.tableDnD.dragObject = null;
|
||||
if (config.onDrop) {
|
||||
// Call the onDrop method if there is one
|
||||
config.onDrop(jQuery.tableDnD.currentTable, droppedRow);
|
||||
}
|
||||
jQuery.tableDnD.currentTable = null; // let go of the table too
|
||||
}
|
||||
},
|
||||
|
||||
serialize: function() {
|
||||
if (jQuery.tableDnD.currentTable) {
|
||||
return jQuery.tableDnD.serializeTable(jQuery.tableDnD.currentTable);
|
||||
} else {
|
||||
return "Error: No Table id set, you need to set an id on your table and every row";
|
||||
}
|
||||
},
|
||||
|
||||
serializeTable: function(table) {
|
||||
var result = "";
|
||||
var tableId = table.id;
|
||||
var rows = table.rows;
|
||||
for (var i=0; i<rows.length; i++) {
|
||||
if (result.length > 0) result += "&";
|
||||
var rowId = rows[i].id;
|
||||
if (rowId && rowId && table.tableDnDConfig && table.tableDnDConfig.serializeRegexp) {
|
||||
rowId = rowId.match(table.tableDnDConfig.serializeRegexp)[0];
|
||||
}
|
||||
|
||||
result += tableId + '[]=' + rowId;
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
serializeTables: function() {
|
||||
var result = "";
|
||||
this.each(function() {
|
||||
// this is now bound to each matching table
|
||||
result += jQuery.tableDnD.serializeTable(this);
|
||||
});
|
||||
return result;
|
||||
},
|
||||
destroy:function(){
|
||||
jQuery(document)
|
||||
.unbind('mousemove', jQuery.tableDnD.mousemove)
|
||||
.unbind('mouseup', jQuery.tableDnD.mouseup);
|
||||
}
|
||||
}
|
||||
|
||||
jQuery.fn.extend(
|
||||
{
|
||||
tableDnD : jQuery.tableDnD.build,
|
||||
tableDnDUpdate : jQuery.tableDnD.updateTables,
|
||||
tableDnDSerialize: jQuery.tableDnD.serializeTables,
|
||||
unTableDnD : jQuery.tableDnD.destroy
|
||||
}
|
||||
);
|
||||
@@ -0,0 +1,6 @@
|
||||
.ui-searchFilter { display: none; position: absolute; z-index: 770; overflow: visible;}
|
||||
.ui-searchFilter table {position:relative; margin:0em; width:auto}
|
||||
.ui-searchFilter table td {margin: 0em; padding: 1px;}
|
||||
.ui-searchFilter table td input, .ui-searchFilter table td select {margin: 0.1em;}
|
||||
.ui-searchFilter .ui-state-default { cursor: pointer; }
|
||||
.ui-searchFilter .divider hr {margin: 1px; }
|
||||
@@ -0,0 +1,30 @@
|
||||
/* Multiselect
|
||||
----------------------------------*/
|
||||
|
||||
.ui-multiselect { border: solid 1px; font-size: 0.8em; }
|
||||
.ui-multiselect ul { -moz-user-select: none; }
|
||||
.ui-multiselect li { margin: 0; padding: 0; cursor: default; line-height: 20px; height: 20px; font-size: 11px; list-style: none; }
|
||||
.ui-multiselect li a { color: #999; text-decoration: none; padding: 0; display: block; float: left; cursor: pointer;}
|
||||
.ui-multiselect li.ui-draggable-dragging { padding-left: 10px; }
|
||||
|
||||
.ui-multiselect div.selected { position: relative; padding: 0; margin: 0; border: 0; float:left; }
|
||||
.ui-multiselect ul.selected { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; position: relative; width: 100%; }
|
||||
.ui-multiselect ul.selected li { }
|
||||
|
||||
.ui-multiselect div.available { position: relative; padding: 0; margin: 0; border: 0; float:left; border-left: 1px solid; }
|
||||
.ui-multiselect ul.available { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; width: 100%; }
|
||||
.ui-multiselect ul.available li { padding-left: 10px; }
|
||||
|
||||
.ui-multiselect .ui-state-default { border: none; margin-bottom: 1px; position: relative; padding-left: 20px;}
|
||||
.ui-multiselect .ui-state-hover { border: none; }
|
||||
.ui-multiselect .ui-widget-header {border: none; font-size: 11px; margin-bottom: 1px;}
|
||||
|
||||
.ui-multiselect .add-all { float: right; padding: 7px;}
|
||||
.ui-multiselect .remove-all { float: right; padding: 7px;}
|
||||
.ui-multiselect .search { float: left; padding: 4px;}
|
||||
.ui-multiselect .count { float: left; padding: 7px;}
|
||||
|
||||
.ui-multiselect li span.ui-icon { position: absolute; left: 2px; }
|
||||
.ui-multiselect li a.action { position: absolute; right: 20px; top: 2px; }
|
||||
|
||||
.ui-multiselect input.search { height: 14px; padding: 1px; opacity: 0.5; margin: 4px; width: 100px; }
|
||||
@@ -0,0 +1,314 @@
|
||||
/*
|
||||
* jQuery UI Multiselect
|
||||
*
|
||||
* Authors:
|
||||
* Michael Aufreiter (quasipartikel.at)
|
||||
* Yanick Rochon (yanick.rochon[at]gmail[dot]com)
|
||||
*
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* http://www.quasipartikel.at/multiselect/
|
||||
*
|
||||
*
|
||||
* Depends:
|
||||
* ui.core.js
|
||||
* ui.sortable.js
|
||||
*
|
||||
* Optional:
|
||||
* localization (http://plugins.jquery.com/project/localisation)
|
||||
* scrollTo (http://plugins.jquery.com/project/ScrollTo)
|
||||
*
|
||||
* Todo:
|
||||
* Make batch actions faster
|
||||
* Implement dynamic insertion through remote calls
|
||||
*/
|
||||
|
||||
|
||||
(function($) {
|
||||
|
||||
$.widget("ui.multiselect", {
|
||||
_init: function() {
|
||||
this.element.hide();
|
||||
this.id = this.element.attr("id");
|
||||
this.container = $('<div class="ui-multiselect ui-helper-clearfix ui-widget"></div>').insertAfter(this.element);
|
||||
this.count = 0; // number of currently selected options
|
||||
this.selectedContainer = $('<div class="selected"></div>').appendTo(this.container);
|
||||
this.availableContainer = $('<div class="available"></div>').appendTo(this.container);
|
||||
this.selectedActions = $('<div class="actions ui-widget-header ui-helper-clearfix"><span class="count">0 '+$.ui.multiselect.locale.itemsCount+'</span><a href="#" class="remove-all">'+$.ui.multiselect.locale.removeAll+'</a></div>').appendTo(this.selectedContainer);
|
||||
this.availableActions = $('<div class="actions ui-widget-header ui-helper-clearfix"><input type="text" class="search empty ui-widget-content ui-corner-all"/><a href="#" class="add-all">'+$.ui.multiselect.locale.addAll+'</a></div>').appendTo(this.availableContainer);
|
||||
this.selectedList = $('<ul class="selected connected-list"><li class="ui-helper-hidden-accessible"></li></ul>').bind('selectstart', function(){return false;}).appendTo(this.selectedContainer);
|
||||
this.availableList = $('<ul class="available connected-list"><li class="ui-helper-hidden-accessible"></li></ul>').bind('selectstart', function(){return false;}).appendTo(this.availableContainer);
|
||||
|
||||
var that = this;
|
||||
|
||||
// set dimensions
|
||||
this.container.width(this.element.width()+1);
|
||||
this.selectedContainer.width(Math.floor(this.element.width()*this.options.dividerLocation));
|
||||
this.availableContainer.width(Math.floor(this.element.width()*(1-this.options.dividerLocation)));
|
||||
|
||||
// fix list height to match <option> depending on their individual header's heights
|
||||
this.selectedList.height(Math.max(this.element.height()-this.selectedActions.height(),1));
|
||||
this.availableList.height(Math.max(this.element.height()-this.availableActions.height(),1));
|
||||
|
||||
if ( !this.options.animated ) {
|
||||
this.options.show = 'show';
|
||||
this.options.hide = 'hide';
|
||||
}
|
||||
|
||||
// init lists
|
||||
this._populateLists(this.element.find('option'));
|
||||
|
||||
// make selection sortable
|
||||
if (this.options.sortable) {
|
||||
$("ul.selected").sortable({
|
||||
placeholder: 'ui-state-highlight',
|
||||
axis: 'y',
|
||||
update: function(event, ui) {
|
||||
// apply the new sort order to the original selectbox
|
||||
that.selectedList.find('li').each(function() {
|
||||
if ($(this).data('optionLink'))
|
||||
$(this).data('optionLink').remove().appendTo(that.element);
|
||||
});
|
||||
},
|
||||
receive: function(event, ui) {
|
||||
ui.item.data('optionLink').attr('selected', true);
|
||||
// increment count
|
||||
that.count += 1;
|
||||
that._updateCount();
|
||||
// workaround, because there's no way to reference
|
||||
// the new element, see http://dev.jqueryui.com/ticket/4303
|
||||
that.selectedList.children('.ui-draggable').each(function() {
|
||||
$(this).removeClass('ui-draggable');
|
||||
$(this).data('optionLink', ui.item.data('optionLink'));
|
||||
$(this).data('idx', ui.item.data('idx'));
|
||||
that._applyItemState($(this), true);
|
||||
});
|
||||
|
||||
// workaround according to http://dev.jqueryui.com/ticket/4088
|
||||
setTimeout(function() { ui.item.remove(); }, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// set up livesearch
|
||||
if (this.options.searchable) {
|
||||
this._registerSearchEvents(this.availableContainer.find('input.search'));
|
||||
} else {
|
||||
$('.search').hide();
|
||||
}
|
||||
|
||||
// batch actions
|
||||
$(".remove-all").click(function() {log(2)
|
||||
that._populateLists(that.element.find('option').removeAttr('selected'));
|
||||
return false;
|
||||
});
|
||||
$(".add-all").click(function() {log(1)
|
||||
that._populateLists(that.element.find('option').attr('selected', 'selected'));
|
||||
return false;
|
||||
});
|
||||
},
|
||||
destroy: function() {
|
||||
this.element.show();
|
||||
this.container.remove();
|
||||
|
||||
$.widget.prototype.destroy.apply(this, arguments);
|
||||
},
|
||||
_populateLists: function(options) {
|
||||
this.selectedList.children('.ui-element').remove();
|
||||
this.availableList.children('.ui-element').remove();
|
||||
this.count = 0;
|
||||
|
||||
var that = this;
|
||||
var items = $(options.map(function(i) {
|
||||
var item = that._getOptionNode(this).appendTo(this.selected ? that.selectedList : that.availableList).show();
|
||||
|
||||
if (this.selected) that.count += 1;
|
||||
that._applyItemState(item, this.selected);
|
||||
item.data('idx', i);
|
||||
return item[0];
|
||||
}));
|
||||
|
||||
// update count
|
||||
this._updateCount();
|
||||
},
|
||||
_updateCount: function() {
|
||||
this.selectedContainer.find('span.count').text(this.count+" "+$.ui.multiselect.locale.itemsCount);
|
||||
},
|
||||
_getOptionNode: function(option) {
|
||||
option = $(option);
|
||||
var node = $('<li class="ui-state-default ui-element" title="'+option.text()+'"><span class="ui-icon"></span>'+option.text()+'<a href="#" class="action"><span class="ui-corner-all ui-icon"></span></a></li>').hide();
|
||||
node.data('optionLink', option);
|
||||
return node;
|
||||
},
|
||||
// clones an item with associated data
|
||||
// didn't find a smarter away around this
|
||||
_cloneWithData: function(clonee) {
|
||||
var clone = clonee.clone();
|
||||
clone.data('optionLink', clonee.data('optionLink'));
|
||||
clone.data('idx', clonee.data('idx'));
|
||||
return clone;
|
||||
},
|
||||
_setSelected: function(item, selected) {
|
||||
item.data('optionLink').attr('selected', selected);
|
||||
|
||||
if (selected) {
|
||||
var selectedItem = this._cloneWithData(item);
|
||||
item[this.options.hide](this.options.animated, function() { $(this).remove(); });
|
||||
selectedItem.appendTo(this.selectedList).hide()[this.options.show](this.options.animated);
|
||||
|
||||
this._applyItemState(selectedItem, true);
|
||||
return selectedItem;
|
||||
} else {
|
||||
|
||||
// look for successor based on initial option index
|
||||
var items = this.availableList.find('li'), comparator = this.options.nodeComparator;
|
||||
var succ = null, i = item.data('idx'), direction = comparator(item, $(items[i]));
|
||||
|
||||
// TODO: test needed for dynamic list populating
|
||||
if ( direction ) {
|
||||
while (i>=0 && i<items.length) {
|
||||
direction > 0 ? i++ : i--;
|
||||
if ( direction != comparator(item, $(items[i])) ) {
|
||||
// going up, go back one item down, otherwise leave as is
|
||||
succ = items[direction > 0 ? i : i+1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
succ = items[i];
|
||||
}
|
||||
|
||||
var availableItem = this._cloneWithData(item);
|
||||
succ ? availableItem.insertBefore($(succ)) : availableItem.appendTo(this.availableList);
|
||||
item[this.options.hide](this.options.animated, function() { $(this).remove(); });
|
||||
availableItem.hide()[this.options.show](this.options.animated);
|
||||
|
||||
this._applyItemState(availableItem, false);
|
||||
return availableItem;
|
||||
}
|
||||
},
|
||||
_applyItemState: function(item, selected) {
|
||||
if (selected) {
|
||||
if (this.options.sortable)
|
||||
item.children('span').addClass('ui-icon-arrowthick-2-n-s').removeClass('ui-helper-hidden').addClass('ui-icon');
|
||||
else
|
||||
item.children('span').removeClass('ui-icon-arrowthick-2-n-s').addClass('ui-helper-hidden').removeClass('ui-icon');
|
||||
item.find('a.action span').addClass('ui-icon-minus').removeClass('ui-icon-plus');
|
||||
this._registerRemoveEvents(item.find('a.action'));
|
||||
|
||||
} else {
|
||||
item.children('span').removeClass('ui-icon-arrowthick-2-n-s').addClass('ui-helper-hidden').removeClass('ui-icon');
|
||||
item.find('a.action span').addClass('ui-icon-plus').removeClass('ui-icon-minus');
|
||||
this._registerAddEvents(item.find('a.action'));
|
||||
}
|
||||
|
||||
this._registerHoverEvents(item);
|
||||
},
|
||||
// taken from John Resig's liveUpdate script
|
||||
_filter: function(list) {
|
||||
var input = $(this);
|
||||
var rows = list.children('li'),
|
||||
cache = rows.map(function(){
|
||||
|
||||
return $(this).text().toLowerCase();
|
||||
});
|
||||
|
||||
var term = $.trim(input.val().toLowerCase()), scores = [];
|
||||
|
||||
if (!term) {
|
||||
rows.show();
|
||||
} else {
|
||||
rows.hide();
|
||||
|
||||
cache.each(function(i) {
|
||||
if (this.indexOf(term)>-1) { scores.push(i); }
|
||||
});
|
||||
|
||||
$.each(scores, function() {
|
||||
$(rows[this]).show();
|
||||
});
|
||||
}
|
||||
},
|
||||
_registerHoverEvents: function(elements) {
|
||||
elements.removeClass('ui-state-hover');
|
||||
elements.mouseover(function() {
|
||||
$(this).addClass('ui-state-hover');
|
||||
});
|
||||
elements.mouseout(function() {
|
||||
$(this).removeClass('ui-state-hover');
|
||||
});
|
||||
},
|
||||
_registerAddEvents: function(elements) {
|
||||
var that = this;
|
||||
elements.click(function() {
|
||||
var item = that._setSelected($(this).parent(), true);
|
||||
that.count += 1;
|
||||
that._updateCount();
|
||||
return false;
|
||||
})
|
||||
// make draggable
|
||||
.each(function() {
|
||||
$(this).parent().draggable({
|
||||
connectToSortable: 'ul.selected',
|
||||
helper: function() {
|
||||
var selectedItem = that._cloneWithData($(this)).width($(this).width() - 50);
|
||||
selectedItem.width($(this).width());
|
||||
return selectedItem;
|
||||
},
|
||||
appendTo: '.ui-multiselect',
|
||||
containment: '.ui-multiselect',
|
||||
revert: 'invalid'
|
||||
});
|
||||
});
|
||||
},
|
||||
_registerRemoveEvents: function(elements) {
|
||||
var that = this;
|
||||
elements.click(function() {
|
||||
that._setSelected($(this).parent(), false);
|
||||
that.count -= 1;
|
||||
that._updateCount();
|
||||
return false;
|
||||
});
|
||||
},
|
||||
_registerSearchEvents: function(input) {
|
||||
var that = this;
|
||||
|
||||
input.focus(function() {
|
||||
$(this).addClass('ui-state-active');
|
||||
})
|
||||
.blur(function() {
|
||||
$(this).removeClass('ui-state-active');
|
||||
})
|
||||
.keypress(function(e) {
|
||||
if (e.keyCode == 13)
|
||||
return false;
|
||||
})
|
||||
.keyup(function() {
|
||||
that._filter.apply(this, [that.availableList]);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$.extend($.ui.multiselect, {
|
||||
defaults: {
|
||||
sortable: true,
|
||||
searchable: true,
|
||||
animated: 'fast',
|
||||
show: 'slideDown',
|
||||
hide: 'slideUp',
|
||||
dividerLocation: 0.6,
|
||||
nodeComparator: function(node1,node2) {
|
||||
var text1 = node1.text(),
|
||||
text2 = node2.text();
|
||||
return text1 == text2 ? 0 : (text1 < text2 ? -1 : 1);
|
||||
}
|
||||
},
|
||||
locale: {
|
||||
addAll:'Add all',
|
||||
removeAll:'Remove all',
|
||||
itemsCount:'items selected'
|
||||
}
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
Reference in New Issue
Block a user