<form id="search-form" class="search-form" data-custom-modal-search-value="" data-page="" data-module="" data-search-id="" data-gui-title="" data-gui-id="" data-gui-columns='[]' data-options='{  }' data-show-status="true" data-create-parent="true" data-actions='[  ]'>
    <div class="search-panel card">
        <ul class="filter-options" style="display: none">
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="guiSearch" data-title="GUI" data-type="simple" data-advanced="" data-advanced-crit="" data-return="" data-dropdown='[]' data-range='[]' data-return="" data-return-display=""
                data-custom-modal-search-value="" data-columns='[]' data-options='[]' data-actions='[]'>GUI</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="chrShortTitle" data-title="Title" data-type="simple" data-advanced="" data-advanced-crit="" data-return="" data-dropdown='[]' data-range='[]' data-return="" data-return-display=""
                data-custom-modal-search-value="" data-columns='[]' data-options='[]' data-actions='[]'>Title</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="chrFirstNamedInvestigator" data-title="Internal Investigator" data-type="advanced" data-advanced="people" data-advanced-crit="Surname" data-return="chrStaffNumber" data-dropdown='[]'
                data-range='[]' data-return="chrStaffNumber" data-return-display="" data-custom-modal-search-value="test" data-columns='[ { "name": "chrSurname", "title": "Surname" }, { "name": "chrFirstName", "title": "First Name" }, { "name": "chrTier3Name", "title": "Department" }, { "name": "chrEmail", "title": "Email" }]'
                data-options='[ { "name": "IncludeLinked", "title": "Include Linked", "type": "checkbox" }, { "name": "FirstNamed", "title": "First Named", "type": "checkbox" }, { "name": "SearchValue2", "title": "Initials", "type": "text" }, { "name": "SearchValue3", "title": "Operator", "type": "dropdown", "list": [  { "value": "contains", "title": "contains" } , { "value": "begins", "title": "begins with" } , { "value": "sounds", "title": "sounds like" }  ]  }]'
                data-actions='[ { "name": "details", "icon": "details" }]'>Internal Investigator</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="externalInvestigator" data-title="External Investigator" data-type="advanced" data-advanced="externals" data-advanced-crit="Surname" data-return="chrCode" data-dropdown='[]'
                data-range='[]' data-return="chrCode" data-return-display="" data-custom-modal-search-value="test" data-columns='[ { "name": "chrSurname", "title": "Surname" }, { "name": "chrFirstName", "title": "First Name" }, { "name": "chrTier3Name", "title": "Institution" }, { "name": "chrEmail", "title": "Email" }]'
                data-options='[ { "name": "IncludeLinked", "title": "Include Linked", "type": "checkbox" }, { "name": "SearchValue2", "title": "Initials", "type": "text" }, { "name": "SearchValue3", "title": "Operator", "type": "dropdown", "list": [  { "value": "contains", "title": "contains" } , { "value": "begins", "title": "begins with" } , { "value": "sounds", "title": "sounds like" }  ]  }]'
                data-actions='[ { "name": "details", "icon": "details" }]'>External Investigator</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="guiDepartments" data-title="Department" data-type="advanced" data-advanced="departments" data-advanced-crit="Department name" data-return="chrTier3Code" data-dropdown='[]'
                data-range='[]' data-return="chrTier3Code" data-return-display="$chrTier3Name" data-custom-modal-search-value="department" data-columns='[ { "name": "chrTier3Name", "title": "Department" }]' data-options='[]' data-actions='[ { "name": "details", "icon": "details" }]'>Department</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="startDate" data-title="Starting Year" data-type="range" data-advanced="" data-advanced-crit="" data-return="" data-dropdown='[]' data-range='["chrGrantStartDate","chrCompletionDate"]'
                data-return="" data-return-display="" data-custom-modal-search-value="" data-columns='[]' data-options='[]' data-actions='[]'>Starting Year</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="chrApprovalDate" data-title="Approval Date" data-type="date" data-advanced="" data-advanced-crit="" data-return="" data-dropdown='[]' data-range='[]' data-return="" data-return-display=""
                data-custom-modal-search-value="" data-columns='[]' data-options='[]' data-actions='[]'>Approval Date</li>
            <li class="dropdown-item filter-item" role="menuitem" data-active="true" data-name="chrStatus" data-title="Status" data-type="dropdown" data-advanced="" data-advanced-crit="" data-return="" data-dropdown='["active","awarded","closed","completed","draft","grants completed","new","pending","test","wind-down"]'
                data-range='[]' data-return="" data-return-display="" data-custom-modal-search-value="" data-columns='[]' data-options='[]' data-actions='[]'>Status</li>
        </ul>

        <div class="card-section">
            <div class="card-inner">
                <h3 class="card-heading card-title">
                    <div class="text">Searching </div>

                    <div class="save-search">
                        <button type="button" class="btn btn-link js-btn-load-search js-btn-modal" data-modal="load-search">
							<span class="fa fa-folder-open-o"></span>
							<span class="link link-strong">My Searches</span>
						</button>
                        <button type="button" class="btn btn-link js-btn-save-search js-btn-modal" data-modal="save-search">
							<span class="fa fa-floppy-o"></span>
							<span class="link link-strong">Save Search</span>
						</button>
                    </div>
                </h3>

                <div class="search-subheading">
                    <h4 class="card-subheading" data-col="12">
                        <span data-span="10">Search Fields</span>
                        <span class="subheading-right" data-span="2">Add / Remove</span>
                    </h4>
                    <p class="card-note">Use the 'Lookup' function to complete relevant fields</p>
                </div>

                <div class="form-container">
                    <div class="create-filters">
                    </div>
                </div>

                <button class="btn btn-default btn-submit"><span>Show</span> Records</button>
            </div>
        </div>
    </div>
</form>

<div class="modal modal-advanced-search js-modal js-modal-exit -nav-padded -with-overlay" data-modal="advanced-search">
    <div class="modal-inner inner">
        <div class="modal-panel advanced-search-container">
            <div class="modal-header">
                <button type="button" class="btn btn-default btn-modal-exit js-modal-exit svg-wrap" aria-label="Exit Modal">
					<span class="fa fa-times"></span>
				</button>
                <h3 class="modal-title">
                    <span class="text">Advanced Lookup</span>
                </h3>
            </div>
            <div class="modal-section advanced-search-form modal-advanced-form">
                <div data-col="6">
                    <div class="form-field advanced-search-field" data-flex="4" data-col="4" data-required="true" data-min-length="2">
                        <label class="advanced-search-label" data-flex="1" for="SearchValue"></label>
                        <input data-flex="3" name="SearchValue" class="advanced-search-input"></input>
                    </div>

                    <div class="criteria-text form-field advanced-search-field" data-col="6" data-flex="2">
                        <div data-flex="2"></div>
                        <label class="advanced-search-label" data-flex="2" for="SearchValue"></label>
                        <input data-flex="2" name="SearchValue" class="advanced-search-input"></input>
                    </div>
                </div>
                <div class="advanced-search-criteria" data-col="6">
                    <div class="criteria-dropdown form-field advanced-search-field" data-col="6" data-flex="6"></div>
                    <div class="criteria-checkbox form-field advanced-search-field" data-col="3" data-flex="3"></div>

                    <div class="btn-container" data-flex="3">
                        <a class="btn btn-create-record js-parent-create-record">
							<span class="fa fa-plus-circle"></span>
							<span class="link link-strong">Create a new record</span>
						</a>

                        <button type="button" class="btn btn-default btn-update-advanced js-btn-update-advanced">
							<div class="text">Show Records</div>
						</button>
                    </div>
                </div>
            </div>

            <div class="modal-section modal-results advanced-search-results">

            </div>
        </div>
    </div>
</div>
<div class="modal -with-overlay -nav-padded js-modal js-modal-exit" data-modal="save-search">
    <div class="modal-inner inner">
        <div class="modal-panel">
            <div class="modal-header">
                <button type="button" class="btn btn-default btn-modal-exit js-modal-exit svg-wrap" aria-label="Exit Modal">
					<span class="fa fa-times"></span>
				</button>
                <h3 class="modal-title">
                    <span class="text">Save search</span>
                </h3>
            </div>

            <div class="modal-section modal-form">
                <div class="form-field save-field" data-col="6" data-required="true" data-min-length="5">
                    <label for="save-search-title" data-flex="1">Save As</label>
                    <input name="save-search-title" placeholder="&hellip;">

                    <button type="button" class="btn svg-wrap btn-save-as js-save-as" aria-label="Save as existing search">
						<svg viewBox="0 0 25 25">
							<use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-arrow-down"></use>
						</svg>
					</button>
                </div>
            </div>

            <div class="modal-section modal-results">
            </div>

            <div class="modal-section modal-buttons">
                <button class="btn btn-default js-save-search js-modal-submit" type="button">
					<span class="text">Save this search</span>
				</button>

                <button class="btn btn-default js-modal-exit" type="button">
					<span class="text">Cancel</span>
				</button>
            </div>
        </div>
    </div>
</div>
<div class="modal modal-load-search -with-overlay -nav-padded js-modal js-modal-exit" data-modal="load-search">
    <div class="modal-inner inner">
        <div class="modal-panel">
            <div class="modal-header">
                <button type="button" class="btn btn-default btn-modal-exit js-modal-exit svg-wrap" aria-label="Exit Modal">
					<span class="fa fa-times"></span>
				</button>
                <h3 class="modal-title">
                    <span class="text">My saved searches</span>
                </h3>
            </div>

            <div class="modal-section modal-results">
            </div>

            <div class="modal-section modal-buttons">
                <button class="btn btn-default js-load-search js-modal-exit js-modal-submit" type="button">
					<span class="text">Load search</span>
				</button>

                <button class="btn btn-default js-modal-exit" type="button">
					<span class="text">Cancel</span>
				</button>
            </div>
        </div>
    </div>
</div>
<div class="modal modal-gui-new -with-overlay -nav-padded js-modal js-modal-exit" data-modal="gui-new">
    <div class="modal-inner inner">
        <div class="modal-panel">
            <div class="modal-header">
                <button type="button" class="btn btn-default btn-modal-exit js-modal-exit svg-wrap" aria-label="Exit Modal">
					<span class="fa fa-times"></span>
				</button>
                <h3 class="modal-title">
                    <span class="text">Create new custom GUI</span>
                </h3>
            </div>

            <div class="modal-section modal-form">
                <div class="form-field save-field" data-col="6" data-required="true" data-min-length="5">
                    <label for="new-gui-title" data-flex="1">GUI name</label>
                    <input name="new-gui-title" placeholder="&hellip;">
                </div>
            </div>

            <div class="modal-section modal-results">
            </div>

            <div class="modal-section modal-buttons">
                <button class="btn btn-default js-gui-new js-modal-submit" type="button">
					<span class="text">Create GUI</span>
				</button>

                <button class="btn btn-default js-modal-exit" type="button">
					<span class="text">Cancel</span>
				</button>
            </div>
        </div>
    </div>
</div>
<div class="modal modal-gui-select -with-overlay -nav-padded js-modal js-modal-exit" data-modal="gui-select">
    <div class="modal-inner inner">
        <div class="modal-panel">
            <div class="modal-header">
                <button type="button" class="btn btn-default btn-modal-exit js-modal-exit svg-wrap" aria-label="Exit Modal">
					<span class="fa fa-times"></span>
				</button>
                <h3 class="modal-title">
                    <span class="text">My custom GUI</span>
                </h3>
            </div>

            <div class="modal-section modal-results">
            </div>

            <div class="modal-section modal-buttons">
                <button class="btn btn-default js-load-gui js-modal-exit js-modal-submit" type="button">
					<span class="text">Load GUI</span>
				</button>

                <button class="btn btn-default js-modal-exit" type="button">
					<span class="text">Cancel</span>
				</button>
            </div>
        </div>
    </div>
</div>
<div class="modal modal-gui-update -with-overlay -nav-padded js-modal js-modal-exit" data-modal="gui-update">
    <div class="modal-inner inner">
        <div class="modal-panel">
            <div class="modal-header">
                <button type="button" class="btn btn-default btn-modal-exit js-modal-exit svg-wrap" aria-label="Exit Modal">
					<span class="fa fa-times"></span>
				</button>
                <h3 class="modal-title">
                    <span class="text">Update current GUI</span>
                </h3>
            </div>

            <div class="modal-section modal-form">
                <div class="form-field save-field" data-col="6" data-required="true" data-min-length="5">
                    <label for="new-gui-title" data-flex="1">GUI name</label>
                    <input name="new-gui-title" placeholder="&hellip;" disabled>
                </div>
            </div>

            <div class="modal-section modal-results">
            </div>

            <div class="modal-section modal-buttons">
                <button class="btn btn-default js-gui-new js-modal-submit" type="button">
					<span class="text">Update GUI</span>
				</button>

                <button class="btn btn-default js-modal-exit" type="button">
					<span class="text">Cancel</span>
				</button>
            </div>
        </div>
    </div>
</div>
<form id="search-form" class="search-form" 
	data-custom-modal-search-value="{{ searchOptions.customModalSearchValue }}" 
	data-page="{{ pageClass }}{{ pageTitle }}"
	data-module="{{ searchOptions.module }}"
	data-search-id="{{ searchOptions.searchID }}"
	data-gui-title="{{ searchOptions.guiTitle }}"
	data-gui-id="{{ searchOptions.guiID }}"
	data-gui-columns='[{{#each searchOptions.guiColumns }} { "name": "{{ this.name }}", "title": "{{ this.title }}", "width": "{{ this.width }}"{{#if this.em }}, "em": {{ this.em }}{{/if}} }{{#if @last }}{{else}},{{/if}}{{/each}}]' 
	data-options='{ {{#each searchOptions.options }}"{{ @key }}": "{{ this }}"{{#if @last }}{{else}}, {{/if}}{{/each}} }'
	data-show-status="true"
	data-create-parent="true"
	data-actions='[ {{#each searchOptions.actions }}{ "name": "{{ this.name }}", "icon": "{{ this.icon }}", "label": "{{ this.label }}"{{#if this.data }}, "data": { {{#each this.data as |value key| }}"{{ key }}": "{{ value }}"{{#if @last }}{{else}}, {{/if}}{{/each}} } {{/if}} } {{#if @last }}{{else}}, {{/if}}{{/each}} ]' >		
	<div class="search-panel card">
		<ul class="filter-options" style="display: none">
			{{> '@search-filter-list' }}
		</ul>

		<div class="card-section">
			<div class="card-inner">
				<h3 class="card-heading card-title">
					<div class="text">Searching {{ pageTitle }}</div>

					<div class="save-search">
						<button type="button" class="btn btn-link js-btn-load-search js-btn-modal" data-modal="load-search">
							<span class="fa fa-folder-open-o"></span>
							<span class="link link-strong">My Searches</span>
						</button>
						<button type="button" class="btn btn-link js-btn-save-search js-btn-modal" data-modal="save-search">
							<span class="fa fa-floppy-o"></span>
							<span class="link link-strong">Save Search</span>
						</button>
					</div>
				</h3>

				<div class="search-subheading">
					<h4 class="card-subheading" data-col="12">
						<span data-span="10">Search Fields</span>
						<span class="subheading-right" data-span="2">Add / Remove</span>
					</h4>
					<p class="card-note">Use the 'Lookup' function to complete relevant fields</p>
				</div>

				<div class="form-container">
					<div class="create-filters">
					</div>
				</div>

				<button class="btn btn-default btn-submit"><span>Show</span> Records</button>
			</div>
		</div>
	</div>
</form>

{{> '@modal--search' }}
{{> '@modal--save-search' }}
{{> '@modal--load-search' }}
{{> '@modal--new-gui' }}
{{> '@modal--load-gui' }}
{{> '@modal--update-gui' }}
{
  "filterOptions": [
    {
      "name": "guiSearch",
      "title": "GUI",
      "type": "simple",
      "active": true
    },
    {
      "name": "chrShortTitle",
      "title": "Title",
      "type": "simple",
      "active": true
    },
    {
      "name": "chrFirstNamedInvestigator",
      "title": "Internal Investigator",
      "type": "advanced",
      "active": true,
      "advanced": "people",
      "advancedCrit": "Surname",
      "return": "chrStaffNumber",
      "customModalSearchValue": "test",
      "columns": [
        {
          "title": "Surname",
          "name": "chrSurname"
        },
        {
          "title": "First Name",
          "name": "chrFirstName"
        },
        {
          "title": "Department",
          "name": "chrTier3Name"
        },
        {
          "title": "Email",
          "name": "chrEmail"
        }
      ],
      "options": [
        {
          "name": "IncludeLinked",
          "title": "Include Linked",
          "type": "checkbox"
        },
        {
          "name": "FirstNamed",
          "title": "First Named",
          "type": "checkbox"
        },
        {
          "name": "SearchValue2",
          "title": "Initials",
          "type": "text"
        },
        {
          "name": "SearchValue3",
          "title": "Operator",
          "type": "dropdown",
          "list": [
            {
              "value": "contains",
              "title": "contains"
            },
            {
              "value": "begins",
              "title": "begins with"
            },
            {
              "value": "sounds",
              "title": "sounds like"
            }
          ]
        }
      ],
      "actions": [
        {
          "name": "details",
          "icon": "details"
        }
      ]
    },
    {
      "name": "externalInvestigator",
      "title": "External Investigator",
      "advanced": "externals",
      "advancedCrit": "Surname",
      "type": "advanced",
      "active": true,
      "return": "chrCode",
      "customModalSearchValue": "test",
      "columns": [
        {
          "title": "Surname",
          "name": "chrSurname"
        },
        {
          "title": "First Name",
          "name": "chrFirstName"
        },
        {
          "title": "Institution",
          "name": "chrTier3Name"
        },
        {
          "title": "Email",
          "name": "chrEmail"
        }
      ],
      "options": [
        {
          "name": "IncludeLinked",
          "title": "Include Linked",
          "type": "checkbox"
        },
        {
          "name": "SearchValue2",
          "title": "Initials",
          "type": "text"
        },
        {
          "name": "SearchValue3",
          "title": "Operator",
          "type": "dropdown",
          "list": [
            {
              "value": "contains",
              "title": "contains"
            },
            {
              "value": "begins",
              "title": "begins with"
            },
            {
              "value": "sounds",
              "title": "sounds like"
            }
          ]
        }
      ],
      "actions": [
        {
          "name": "details",
          "icon": "details"
        }
      ]
    },
    {
      "name": "guiDepartments",
      "title": "Department",
      "advanced": "departments",
      "advancedCrit": "Department name",
      "type": "advanced",
      "active": true,
      "return": "chrTier3Code",
      "returnDisplay": "$chrTier3Name",
      "customModalSearchValue": "department",
      "columns": [
        {
          "title": "Department",
          "name": "chrTier3Name"
        }
      ],
      "actions": [
        {
          "name": "details",
          "icon": "details"
        }
      ]
    },
    {
      "name": "startDate",
      "title": "Starting Year",
      "type": "range",
      "range": [
        "chrGrantStartDate",
        "chrCompletionDate"
      ],
      "active": true
    },
    {
      "name": "chrApprovalDate",
      "title": "Approval Date",
      "type": "date",
      "active": true
    },
    {
      "name": "chrStatus",
      "title": "Status",
      "dropdown": [
        "active",
        "awarded",
        "closed",
        "completed",
        "draft",
        "grants completed",
        "new",
        "pending",
        "test",
        "wind-down"
      ],
      "type": "dropdown",
      "active": true
    }
  ]
}
  • Content:
    .search-form {
    	transition-duration: $transition;
    
    	.card {
    		background: $color-irma-white;
    	}
    
    	.save-search {
    		position: absolute;
    		right: 0;
    		top: 0;
    
    		color: $color-irma-link;
    
    		@include font-size;
    
    		.btn {
    			display: inline-block;
    
    			&:not(:first-child) {
    				margin-left: 10rem;
    			}
    		}
    	}
    
    	.search-subheading {
    		position: relative;
    
    		margin-top: 6rem;
    
    		.subheading-right {
    			text-align: right;
    		}
    	}
    
    	.form-container {
    		margin-top: 5rem;
    	}
    
    	.create-filters {
    		position: relative;
    
    		transition: {
    			property: opacity, visibility;
    			duration: $transition;
    		}
    
    		&.-loading {
    			height: 20rem;
    			overflow: hidden;
    
    			&::before {
    				content: '';
    
    				position: absolute;
    				top: 5rem;
    				left: 50%;
    				transform: translate(-50%, 0);
    
    				display: block;
    				width: 10rem;
    				height: 10rem;
    
    				background: {
    					image: url('../img/spinner.png');
    					size: 100%;
    					repeat: no-repeat;
    					position: center;
    				}
    
    				animation: spin 1s linear infinite;
    			}
    
    			.search-box {
    				visibility: hidden;
    				opacity: 0;
    			}
    		}
    
    		&.-max-filters {
    			.btn-filter-ctrl {
    				&:first-child {
    					opacity: (1 / 6);
    					pointer-events: none;
    				}
    			}
    		}
    
    		&.-locked-filters {
    			.search-box {
    				.filter-select {
    					pointer-events: none;
    
    					.dropdown-label {
    						&::after {
    							display: none;
    						}
    					}
    				}
    			}
    		}
    	}
    
    	.btn-submit {
    		margin-top: 5rem;
    	}
    }
    
    .search-panel {
    	.search-box {
    		&[data-search-type='simple'] {
    			.search-box-input {
    				display: block;
    			}
    		}
    
    		&[data-search-type='advanced'] {
    			.search-box-input, .search-tags, .search-advanced {
    				display: block;
    			}
    		}
    
    		&[data-search-type='dropdown'] {
    			.search-select {
    				display: inline-block;
    			}
    		}
    
    		&[data-search-type='range'] {
    			.search-range {
    				display: flex;
    			}
    		}
    
    		&[data-search-type='date'] {
    			.search-date {
    				display: block;
    			}
    		}
    
    		.search-box-input, .search-select, .search-date, .search-range, .search-tags, .search-advanced {
    			display: none;
    		}
    
    		.search-advanced {
    			top: 50%;
    			right: 9em;
    			transform: translateY(-50%);
    		}
    
    		.search-box-filter {
    			padding: {
    				left: 2rem;
    				right: 7.5em;
    			}
    		}
    
    		.search-tags {
    			left: calc(25% + 5rem);
    		}
    	}
    }
    
    .search-box {
    	position: relative;
    
    	transition: {
    		property: opacity, visibility;
    		duration: $transition;
    	}
    
    	&:not(:first-child) {
    		margin-top: 5rem;
    	}
    
    	&:first-child {
    		.filter-controls {
    			.btn-filter-ctrl {
    				&:last-child {
    					visibility: hidden;
    				}
    			}
    		}
    	}
    
    	&.-hidden {
    		visibility: hidden;
    		opacity: 0;
    	}
    
    	&.-tagged {
    		.dropdown {
    			pointer-events: none;
    
    			.dropdown-label {
    				&::after {
    					display: none;
    				}
    			}
    		}
    
    		.search-box-input {
    			pointer-events: none;
    
    			&::placeholder {
    				opacity: 0;
    			}
    		}
    
    		// .search-tags {
    		// 	margin-top: 10px;
    		// }
    	}
    
    	.filter-select {
    		.dropdown-label {
    			overflow: hidden;
    			white-space: nowrap;
    			text-overflow: ellipsis;
    
    			@include font-primary-bold;
    		}
    	}
    
    	.dropdown {
    		&.search-select {
    			.dropdown-label {
    				background: white;
    			}
    		}
    	}
    
    	.search-select {
    		display: none;
    
    		.dropdown {
    			text-transform: capitalize;
    		}
    	}
    
    	.search-range {
    		display: none;
    
    		.range-to {
    			display: inline-block;
    			width: 20rem;
    			height: 10rem;
    			vertical-align: top;
    			text-align: center;
    
    			// background: $color-irma-stone;
    			// color: white;
    
    			line-height: 10rem;
    		}
    
    		.date-field {
    			flex: 1 1 auto;
    			max-width: calc((100% - 20rem) / 2);
    
    			input {
    				width: 100%;
    			}
    		}
    	}
    
    	.search-date {
    		input {
    			width: 100%;
    		}
    	}
    
    	.search-advanced {
    		position: absolute;
    
    		@include font-primary-bold;
    
    		color: $color-irma-link;
    
    		.fa {
    			margin-right: 1rem;
    		}
    	}
    
    	.filter-controls {
    		position: absolute;
    		top: 50%;
    		right: 0;
    		transform: translateY(-50%);
    
    		display: inline-block;
    		width: 6.5em;
    
    		text-align: right;
    
    		.btn-filter-ctrl {
    			display: inline-block;
    			vertical-align: middle;
    
    			line-height: 2.1em;
    		}
    	}			
    }
    
    .search-tags {
    	position: absolute;
    	top: 50%;
    	transform: translateY(-50%);
    
    	.tag-item {
    		position: relative;
    
    		display: inline-block;
    		width: 100%;
    		height: 6rem;
    		padding: 0 6rem 0 3rem;
    
    		background: $color-irma-secondary;
    		border-radius: 2px;
    		color: $color-irma-navy;
    
    		line-height: 6rem;
    
    		transition: background $transition;
    		// margin-left: 8px;
    
    		.remove-tag {
    			position: absolute;
    			right: 1.5rem;
    			top: 50%;
    			transform: translateY(-50%);
    
    			opacity: 0.7;
    
    			transition: all $transition;
    
    			&:hover, &:focus {
    				opacity: 1;
    			}
    		}
    	}
    }
  • URL: /components/raw/search-panel/_search-panel.scss
  • Filesystem Path: components/01-components/search-panel/_search-panel.scss
  • Size: 4.6 KB
  • Content:
    /* 
     *	_search-panel.js
     */
    
    irma.searchPanel = (function () {
    	'use strict';
    
    	var lookupURL = irma.baseURL + "getSearchResults.asp?" + irma.urlParams,
    		searchURL = '',
    		saveSearchURL = '',
    		loadSearchURL = '',
    		getDesignerFieldsURL = '',
    		saveCustomURL = '',
    		getCustomURL = '',
    		currentData = {},
    		advancedPageLength = 25,
    		tableHeadings = [
    		],
    		testData = [
    		],
    		savedSearch,
    		currentSearch;
    
    // •••••••••••••
    
    	var getCurrentSearch = function () {
    		return currentSearch;
    	};
    
    	var getRecords = function (name) {
    		return irma.records[name];
    	};
    
    	var setRecords = function (name, rec) {
    		irma.records[name] = rec;
    	};
    
    	var exportResults = function (format) {
    		var results;
    
    		if (format == 'csv') {
    			results = [[]];
    
    			_.forEach(irma.records.main.columns, function (column, i) {
    				results[0][i] = column.title;
    			});
    
    			_.forEach(_.flatten(irma.records.main.pages), function (row, i) {
    				results[i + 1] = [];
    
    				_.forEach(row.columns, function (column, j) {
    					results[i + 1][j] = column.value;
    				});
    			});
    
    			irma.files.exportCSV("irma_search-results_" + moment().format() + ".csv", results);
    		}
    		else if (format == 'xml') {
    			results = [];
    
    			_.forEach(_.flatten(irma.records.main.pages), function (row, i) {
    				results[i] = {};
    
    				_.forEach(row.columns, function (column, j) {
    					results[i][irma.records.main.columns[j].title.toLowerCase().replace(/ /g, '_')] = column.value;
    				});
    			});
    
    			$.get(irma.assetPath + '/templates/search-results/search-results--xml.hbs?v=' + irma.templateVersion, function (template) {
    				var templateScript = Handlebars.compile(template);
    
    				var xml = templateScript({
    					results: results
    				});
    
            		var blob = new Blob([xml], { type: 'text/xml;charset=utf-8;' });
    
            		irma.files.exportFile("irma_search-results_" + moment().format() + ".xml", blob);
    			});
    		}
    	};
    
    
    // ******* CUSTOM GUI ******* //
    
    	var newGUI = function ($scope, gui) {
    		var url = getDesignerFieldsURL;
    
    		if (gui) {
    			$scope.find('.save-field input').val(gui.title);
    		}
    
    		$scope.addClass('-loading')
    			.find('.modal-results').empty();
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    			showGUIFields(results.data, $scope, gui);
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    		});
    	};
    
    	var showGUIFields = function (data, $scope, gui) {
    		var results = [];
    
    		_.forEach(data, function (field, i) {
    
    			var currentField = [];
    			if (gui !== undefined) {
    				currentField = _.filter(gui.columns, { name: field.chrField, id: field.intGUIfieldCode });
    			}
    
    			results[i] = {
    				columns: [
    					{
    						name: "field",
    						value: field.chrGUIFieldName
    					},
    					{
    						name: field.chrField,
    						value: currentField.length ? currentField[0].title : field.chrGUIFieldName
    					}
    				],
    				checkbox: {
    					id: "gui_" + i,
    					checked: currentField.length > 0
    				},
    				data: {
    					name: field.chrField,
    					id: field.intGUIfieldCode
    				}
    			};
    		});
    
    		var title = "Choose from " + results.length + " field";
    
    		title = results.length > 1 ? title + "s" : title;
    
    		var context = {
    			checkbox: true,
    			columns: [
    				{
    					title: "field",
    					width: 50
    				},
    				{
    					title: "display name",
    					width: 50,
    					input: true
    				}
    			],
    			tableData: results,
    			totalResults: results.length,
    			title: title,
    			rowClass: "-with-input",
    			actions: [
    
    			],
    			data: {
    				
    			}
    		};
    
    		$.get(irma.assetPath + '/templates/table/table.hbs?v=' + irma.templateVersion, function (template) {
    			var templateScript = Handlebars.compile(template);
    
    			var html = templateScript(context);
    
    			$scope.find('.modal-results').html(html);
    			$scope.removeClass('-loading');
    		});
    	};
    
    	var saveGUI = function (title, data) {
    		var state = JSON.stringify(data);
    
    		var url = saveCustomURL + "&searchTitle=" + title + "&searchState=" + state;
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    		});
    	};
    
    	var loadGUIList = function () {
    		var url = getCustomURL,
    			$scope = $('.modal-gui-select');
    
    		$scope.addClass('-loading')
    			.find('.modal-results').empty();
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    			showGUIList(results.data, $scope);
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    		});
    	};
    
    	var showGUIList = function (data, $scope) {
    		var results = [];
    
    		if (data[0].chrTitle) {
    			_.forEach(data, function (search, i) {
    				results[i] = {
    					columns: [
    						{
    							name: "name",
    							value: _.capitalize(search.chrTitle)
    						},
    						{
    							name: "date",
    							value: moment(search.chrLastUpdated).format("D MMM YYYY")
    						}
    					],
    					data: {
    						gui: search.chrState.replace(/&#34;/g, '\"'),
    						title: search.chrTitle,
    						id: search.IDcolumn
    					}
    				};
    			});
    		}
    
    		var title = "Saved GUI";
    
    		title = results.length > 1 ? title + "s" : title;
    
    		var context = {
    			totalColumns: 5,
    			columns: [
    				{
    					title: "name"
    				}, 
    				{
    					title: "date"
    				}
    			],
    			rowClass: "js-select-my-gui table-link",
    			currentPage: results,
    			totalResults: results.length,
    			title: title,
    			actionsTitle: "Delete",
    			actions: [
    				{
    					name: "gui-delete",
    					icon: "delete"
    				}
    			],
    			data: {
    				
    			}
    		};
    
    		$.get(irma.assetPath + '/templates/search-results/search-results--lookup.hbs?v=' + irma.templateVersion, function (template) {
    			var templateScript = Handlebars.compile(template);
    
    			var html = templateScript(context);
    
    			$scope.find('.modal-results').html(html);
    			$scope.removeClass('-loading');
    		});
    	};
    
    	var loadGUI = function (customGUI) {
    		irma.settings.save('customGUI', customGUI);
    
    		if ($('.search-results-container .search-results').length) {
    			$('#search-form .btn-submit').trigger('click');
    		}
    	};
    
    	var deleteGUI = function (title, id) {
    
    		var url = saveCustomURL + "&searchTitle=" + encodeURI(title) + "&searchID=" + id + "&searchType=delete";
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    			loadGUIList();
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    		});
    
    	};
    
    // ******* SAVED SEARCH ******* //
    
    	var saveSearch = function (title, $form, localOnly) {
    		var data = [],
    			$fields = $form.find('.search-box');
    
    		if ($fields.find('.filter-select').length) {
    			_.forEach($fields, function (field, i) {
    				var $field = $(field),
    					$filter = $field.find('.filter-select'),
    					$input;
    
    				var d = {
    					name: $filter.data().name,
    					type: $filter.data().type
    				};
    
    				if (d.type == 'dropdown') {
    					$input = $field.find('.search-select input');
    
    					d.value = $input.val();
    				}
    				else if (d.type == 'advanced') {
    					$input = $field.find('.search-tags input').eq(0);
    
    					d.display = $input.next('.text').text();
    					d.value = $input.val();
    				}
    				else if (d.type == 'range') {
    					$input = $field.find('.search-range .date-input-submit');
    					d.value = [];
    
    					for (var j = 0; j <= 1; j++) {
    						d.value[j] = {
    							value: $input.eq(j).val(),
    							name: $input.eq(j).attr('name')
    						};
    					}
    				}
    				else if (d.type == 'date') {
    					$input = $field.find('.search-date .date-input-submit');
    
    					d.value = $input.val();
    				}
    				else {
    					$input = $field.find('.search-box-input');
    
    					d.value = $input.val();
    				}
    
    				data[i] = d;
    			});
    		}
    		else {
    			var $input = $fields.find('input[name]');
    			data[0] = {
    				name: $input.attr('name'),
    				value: $input.val(),
    				display: $input.siblings('.text').text()
    			};
    		}
    
    		var json = JSON.stringify(data);
    
    		savedSearch = json;
    
    		if (localOnly === undefined || !localOnly) {
    			submitSavedSearch(title, savedSearch);
    		}
    		else {
    			var page = "";
    			irma.form.setRecentSearch({ criteria: savedSearch });
    		}
    	};
    
    	var submitSavedSearch = function (title, savedSearch) {
    		var url = saveSearchURL + "&searchTitle=" + title + "&searchState=" + savedSearch;
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    
    			irma.modal.closeModal();
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    		});
    	};
    
    	var toggleSaveAs = function ($modal, collapse) {
    		if ($modal.is('.-expanded') || collapse) {
    			$modal.removeClass('-loading -expanded');
    		}
    		else {
    			$modal.addClass('-loading');
    			$modal.addClass('-expanded');
    			loadSavedSearches($modal);
    		}
    	};
    
    	var loadSearch = function (data) {
    		var $createFilters = $('.create-filters');
    
    		if (data.length && $createFilters.length) {
    			$createFilters.empty().addClass('-loading');
    
    			newFilter(data[0], null, 0, data);
    		}
    		else {
    			irma.form.addTag(data[0].name, data[0].display, data[0].value);
    		}
    	};
    
    	var loadSavedSearches = function ($scope) {
    		var url = loadSearchURL + '&searchTitle=';
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    			showSavedSearches(results.data, $scope);
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    		});
    	};
    
    	var showSavedSearches = function (data, $scope) {
    		var results = [];
    
    		if (data[0].chrTitle) {
    			_.forEach(data, function (search, i) {
    				results[i] = {
    					columns: [
    						{
    							name: "name",
    							value: _.capitalize(search.chrTitle)
    						},
    						{
    							name: "date",
    							value: moment(search.chrLastUpdated).format("D MMM YYYY")
    						}
    					],
    					data: {
    						filters: search.chrState.replace(/&#34;/g, '\"').replace(/[\t\r\n]/g, ''),
    						title: search.chrTitle,
    						id: search.IDcolumn
    					}
    				};
    			});
    		}
    
    		var title = "Saved search";
    
    		title = results.length > 1 ? title + "es" : title;
    
    		var context = {
    			totalColumns: 5,
    			columns: [
    				{
    					title: "name"
    				}, 
    				{
    					title: "date"
    				}
    			],
    			rowClass: "js-select-my-search table-link",
    			currentPage: results,
    			totalResults: results.length,
    			title: title,
    			actionsTitle: "Delete",
    			actions: [
    				{
    					name: "search-delete",
    					icon: "delete"
    				}
    			],
    			data: {
    				
    			}
    		};
    
    		$.get(irma.assetPath + '/templates/search-results/search-results--lookup.hbs?v=' + irma.templateVersion, function (template) {
    			var templateScript = Handlebars.compile(template);
    
    			var html = templateScript(context);
    
    			$scope.find('.modal-results').html(html);
    			$scope.removeClass('-loading');
    		});
    	};
    
    // ******* SORT TABLE ******* //
    
    	var sortBy = function ($column) {
    		var name = $column.attr('data-name');
    
    		currentSearch.data.options.sortBy = name;
    		currentSearch.data.options.sortDirection = $column.is('.-asc') ? "desc" : "asc";
    
    		irma.records.main.index = 0;
    			
    		submitSearch(currentSearch.$inputs, currentSearch.data);
    	};
    
    // ******* MAIN SEARCH RESULTS ******* //
    
    	var toggleSearch = function (hidePanel) {
    		var $panel = $('.search-form');
    
    		if (hidePanel) {
    			$('body').addClass('-search-results');
    
    			$('body, html').scrollTop(0);
    
    			$panel.height($panel.find('.search-panel').height());
    			$panel.height(0);
    		}
    		else {
    			$('body').removeClass('-search-results');
    
    			$panel.height($panel.find('.search-panel').height());
    
    			setTimeout(function () {
    				$panel.removeAttr('style');
    			}, 5);
    		}
    
    		if ($('.secondary-nav').length) {
    			irma.secondaryNav.update();
    		}
    	};
    
    	var submitSearch = function ($inputs, data) {
    		var query = "";
    
    		var direction = data.options.sortDirection ? data.options.sortDirection : "asc"; 
    
    		$inputs.each(function (i) {
    			var index = i + 1;
    			query += "&SearchName" + index + "=" + $(this).attr('name') + "&SearchValue" + index + "=" + $(this).val();
    		});
    
    		query += "&SearchSortBy=" + data.options.sortBy + "&SearchSortByOrder=" + direction.toUpperCase() + "&SearchPageLength=" + data.options.pageLength + "&SearchPageNumber=" + (irma.records.main.index + 1).toString();
    
    		if (irma.records.main.totalResults > 0) {
    			query += "&SearchType=suppressed";
    		}
    
    		var url = searchURL + query;
    
    		$.ajax({
    			url: url
    		}).done(function (results) {
    			irma.storage.set('searchResults', {
    				results: results.data,
    				status: results.status,
    				totalResults: results.recCount,
    				data: data 
    			});
    
    			irma.records.main.totalResults = results.recCount == 'suppressed' ? irma.records.main.totalResults : results.recCount;
    
    			sortRecords(results.data, data, data.status);
    
    		}).fail(function (jqXHR, textStatus) {
    			irma.logger.postLog(textStatus, url);
    
    			sortRecords([], data, 'failed');
    		});
    	};
    
    	var sortRecords = function (res, data, status) {
    
    		$('.search-results-container').removeClass('-loading');
    
    		var currentPage = [], pages = [],
    			noResults = false,
    			customGUI = irma.storage.get('userSettings').customGUI,
    			guiColumns = customGUI.columns;
    
    		_.forEach(guiColumns, function (column, i) { 
    			if (column.name == data.options.sortBy) {
    				guiColumns[i].sortBy = true;
    				guiColumns[i].sortDirection = data.options.sortDirection;
    			}
    			else {
    				guiColumns[i].sortBy = false;
    				guiColumns[i].sortDirection = null;
    			}
    		});
    
    		data.guiColumns = customGUI.columns;
    		data.guiId = customGUI.id;
    		data.guiTitle = customGUI.title;
    		irma.form.setRecentSearch({ data: data });
    
    		if (status == "failed" || status == "no matching records") {
    			noResults = true;
    		}
    		else {
    			_.forEach(res, function (result, i) {
    				var r = { columns: [], data: {} };
    
    				_.forEach(guiColumns, function (column, j) {
    					var value = result[column.name] ? result[column.name] : "n/a";
    
    					r.columns[j] = {
    						value: value
    					};
    					
    					_.forEach(column, function (value, key) {
    						r.columns[j][key] = value;
    					});
    				});
    
    				r.data = {
    					id: result[irma.searchId],
    					value: result[irma.searchId]	
    				};
    
    				r.submitted = result.hasOwnProperty('chrSubmitted') && result.chrSubmitted && result.chrSubmitted.toLowerCase() == 'yes' ? "submitted" : "unsubmitted";
    
    				currentPage.push(r);
    			});
    
    			for (var i = 0; i < Math.ceil(/*currentPage.length*/ irma.records.main.totalResults / data.options.pageLength); i++) {
    				pages[i] = {
    					number: i + 1
    				};
    			}
    		}
    
    		var totalColumns = guiColumns.length,
    			r = [
    				irma.records.main.index * data.options.pageLength + 1,
    				(irma.records.main.index + 1) * data.options.pageLength
    			];
    
    		if (currentPage.length < data.options.pageLength) {
    			r[1] = r[0] + currentPage.length - 1;
    		}
    
    		var range = "" + r[0] + " - " + r[1] + "";
    
    		if (data.actions) {
    			totalColumns++;
    		}
    
    		var context = {
    			withWrapper: !data.simpleSearch,
    			fixedSearch: data.fixedSearch || false,
    			totalColumns: totalColumns,
    			columns: guiColumns,
    			showStatus: data.showStatus,
    			actions: data.actions,
    			actionsWidth: data.actions.length > 2 ? data.actions.length * 10 : 20,
    			rowClass: "table-link js-edit-record",
    			index: irma.records.main.index,
    			pages: pages,
    			range: range,
    			noResults: noResults,
    			currentPage: currentPage,
    			totalResults: irma.records.main.totalResults,
    			title: $('main.section').data().title,
    			data: {
    				"search-type": "main"
    			},
    			tData: {
    				module: irma.searchModule
    			},
    			toggle: 'toggle' in data ? data.toggle : data.simpleSearch ? false : true,
    			template: "search-results",
    			scope: '.search-results-container',
    			pageLength: data.options.pageLength
    		};
    
    		if (data.hasOwnProperty('customModalSearchValue')) {
    			context.customModalSearchValue = data.customModalSearchValue;
    		}
    
    		irma.records.main = context;
    
    		irma.form.showRecords(irma.records.main);
    	};
    
    // ******* SEARCH FILTER ROWS ******* //
    
    	var rebuildFilter = function ($filter, data, index, callbackData) {
    		var $filterSelect = $filter.find('.filter-select'),
    			$filterList = $filterSelect.find('.dropdown-options'),
    			filterName = $filterSelect.attr('data-name'),
    			page = $('.search-form').attr('data-page').replace(/\s+/g, ''),
    			filterOptions = irma.storage.get('filterOptions')[page];
    
    		$.get(irma.assetPath + '/templates/search-filter-list/search-filter-list.hbs?v=' + irma.templateVersion, function (template) {
    			var templateScript = Handlebars.compile(template),
    				context = {
    					filterOptions: filterOptions
    				};
    
    			var html = templateScript(context);
    
    			$filterList.html(html);
    
    			/*******/
    
    			$filterSelect.trigger('click')
    				.find('.filter-item').filter('[data-name=\'' + data.name + '\']').trigger('click');
    			$filterSelect.data('open', false);
    			$filterSelect.removeClass('-active')
    				.find('.dropdown-options').attr('aria-hidden', true);
    		
    			var $input;
    
    			if (data.type == 'dropdown') {
    				var checkCount = 0;
    
    				var checkDropdown = function () {
    					$filter = $('.search-box').filter(function () {
    						return $(this).index() == $filter.index();
    					});
    					$input = $filter.find('.search-select input');
    
    					if ($input.length) {
    						$input.val(data.value);
    						$filter.find('.search-select .dropdown-label .text').text(data.value);
    					}
    					else if (checkCount < 10) {
    						setTimeout(function () {
    							checkDropdown();
    						}, 100);
    					}
    
    					checkCount++;
    				};
    				checkDropdown();
    			}
    			else if (data.type == 'advanced') {
    				$input = $filter.find('.search-tags input').eq(0);
    
    				if (data.display.length) {
    					irma.form.addTag(data.name, data.display, data.value);
    				}
    			}
    			else if (data.type == 'range') {
    				$input = $filter.find('.search-range .date-input');
    
    				$input.each(function (i) {
    					$(this).val(moment(data.value[i].value).format('DD/MM/YYYY'))
    						.siblings('.date-input-submit').val(data.value[i].value);
    				});
    			}
    			else if (data.type == 'date') {
    				$input = $filter.find('.search-date .date-input');
    
    				$input.val(moment(data.value).format('DD/MM/YYYY'))
    					.siblings('.date-input-submit').val(data.value);
    			}
    			else {
    				$input = $filter.find('.search-box-input');
    
    				$input.val(data.value);
    			}
    
    			if (index < callbackData.length) {
    				newFilter(callbackData[index], null, index, callbackData);
    			}
    			else {
    				$('.create-filters').removeClass('-loading');
    
    				$('.btn-submit').focus();
    			}
    		});
    	};
    
    	var newFilter = function (data, $searchBox, index, callbackData) {
    		$.get(irma.assetPath + '/templates/search-box/search-box.hbs?v=' + irma.templateVersion, function (template) {
    			var templateScript = Handlebars.compile(template);
    
    			var html = templateScript({
    				index: index
    			});
    
    			if ($searchBox) {
    				$searchBox.after(html);
    			}
    			else {
    				$('.create-filters').append(html);
    			}
    
    			var page = $('.search-form').attr('data-page').replace(/\s+/g, ''),
    				filterOptions = irma.storage.get('filterOptions')[page],
    				option = _.find(filterOptions, 'active'),
    				$newFilter = $searchBox ? $searchBox.next('.search-box') : $('.search-box').last();
    
    			if (data) {
    				updateDropdown();
    				rebuildFilter($newFilter, data, index + 1, callbackData);
    			}
    			else {
    				$newFilter.data(option).attr('data-name', option.name)
    					.find('.filter-select').data(option).attr('data-name', option.name)
    					.find('.dropdown-label .text').text(option.title);
    				updateFilter($newFilter, option);
    			}
    		});
    	};
    
    	var removeFilter = function ($searchBox) {
    		$searchBox.remove();
    
    		updateDropdown();
    	};
    
    	var updateFilter = function ($searchBox, data) {
    		var $dropdown = $searchBox.find('.filter-select'),
    			$searchBoxInput = $searchBox.find('.search-box-input'),
    			$range = $searchBox.find('.search-range .date-input-submit'),
    			$select = $searchBox.find('.search-select');
    
    		var searchBoxData = $searchBox.data();
    		$searchBox.data(data);
    		$searchBox.data(searchBoxData);
    		$searchBox.attr('data-name', data.name);
    
    		$select.empty();
    		$range.removeAttr('name');
    		$searchBoxInput.removeAttr('name').removeClass('js-advanced-search-input js-keypress-modal');
    
    		$searchBox.attr('data-search-type', data.type);
    
    		if (data.type == 'dropdown') {
    
    			$.get(irma.assetPath + '/templates/dropdown/dropdown.hbs?v=' + irma.templateVersion, function (template) {
    				var templateScript = Handlebars.compile(template);
    
    				var options = [];
    
    				_.forEach(data.dropdown, function (item, i) {
    					var option = item.trim();
    
    					options[i] = {
    						name: option,
    						title: option
    					};
    				});
    
    				var html = templateScript({
    					name: data.name,
    					options: options,
    					label: $searchBox.find('.filter-select-container .dropdown-label .text').text()
    				});
    
    				$select.html(html);
    			});
    		}
    
    		else if (data.type == 'simple') {
    			$searchBox.find('.search-box-input').attr('name', data.name);
    		}
    
    		else if (data.type == 'range') {
    			for (var i = 0; i <= 1; i++) {
    				$range.eq(i).attr('name', data.range[i].trim());
    			}
    		}
    
    		else if (data.type == 'date') {
    			$searchBox.find('.search-date .date-input-submit').attr('name', data.name);
    		}
    
    		else if (data.type == 'advanced') {
    			$searchBoxInput.addClass('js-advanced-search-input js-keypress-modal');
    		}
    
    		updateDropdown();
    	};
    
    // ******* SEARCH FILTER DROPDOWN ******* //
    
    	var buildDropdown = function () {
    		var filterOptions = irma.storage.get('filterOptions') || {},
    			$searchForm = $('.search-form'),
    			page = $searchForm.length > 0 ? $searchForm.attr('data-page').replace(/\s+/g, '') : null;
    
    		if (page) {
    			filterOptions[page] = [];
    
    			$('.filter-options .filter-item').each(function (i) {
    				filterOptions[page][i] = $(this).data();
    			});
    
    			irma.storage.set('filterOptions', filterOptions);
    		}
    	};
    
    	var updateDropdown = function () {
    		var filterOptions = irma.storage.get('filterOptions') || {},
    			page = $('.search-form').attr('data-page').replace(/\s+/g, ''),
    			active = [];
    
    		$('.search-form .create-filters .filter-select').each(function (i) {
    			active.push($(this).data().name);
    		});
    
    		_.forEach(filterOptions[page], function (option, i) {
    			if (_.indexOf(active, option.name) > -1) {
    				option.active = false;
    			}
    			else {
    				option.active = true;
    			}
    
    			return option;
    		});
    
    		irma.storage.set('filterOptions', filterOptions);
    
    		if ($('.search-box').length >= filterOptions[page].length) {
    			$('.search-form .create-filters').addClass('-max-filters');
    		}
    		else {
    			$('.search-form .create-filters').removeClass('-max-filters');
    		}
    
    		if (active.length == filterOptions[page].length) {
    			$('.search-form .create-filters').addClass('-locked-filters');
    		}
    		else {
    			$('.search-form .create-filters').removeClass('-locked-filters');
    		}
    	};
    
    	var showDropdown = function ($dropdown) {
    		var $dropdownList = $dropdown.find('.dropdown-options'),
    			dropdownName = $dropdown.attr('data-name'),
    			page = $('.search-form').attr('data-page').replace(/\s+/g, ''),
    			filterOptions = irma.storage.get('filterOptions')[page];
    
    		$.get(irma.assetPath + '/templates/search-filter-list/search-filter-list.hbs?v=' + irma.templateVersion, function (template) {
    			var templateScript = Handlebars.compile(template),
    				context = {
    					filterOptions: filterOptions
    				};
    
    			var html = templateScript(context);
    
    			$dropdownList.html(html);
    		});
    	};
    
    // ******* INIT ******* //
    
    	var init = function () {
    		searchURL = irma.baseURL + "getMultipleSearchResults.asp?" + irma.urlParams + "&SearchModule=" + irma.searchModule;
    		saveSearchURL = irma.baseURL + "saveMySearchState.asp?" + irma.urlParams + "&SearchModule=" + irma.searchModule;
    		loadSearchURL = irma.baseURL + "getMySearchState.asp?" + irma.urlParams + "&SearchModule=" + irma.searchModule;
    		getDesignerFieldsURL = irma.baseURL + "getDesignerFields.asp?" + irma.urlParams + "&SearchModule=" + irma.searchModule;
    		saveCustomURL = irma.baseURL + "saveMyCustomState.asp?" + irma.urlParams + "&SearchModule=" + irma.searchModule;
    		getCustomURL = irma.baseURL + "getMyCustomState.asp?" + irma.urlParams + "&SearchModule=" + irma.searchModule;
    
    		irma.newSearch = false;
    
    		if ($('.filter-options').length) {
    			buildDropdown();
    		}
    
    		var recentSearches = irma.storage.get('recentSearches'),
    			searchData, customGUI;
    
    		// check if recent search exists
    
    		if (recentSearches && recentSearches[irma.pageId] && recentSearches[irma.pageId].criteria) {
    			var search = recentSearches[irma.pageId];
    			var criteria = JSON.parse(search.criteria);
    			searchData = search.data;
    
    			loadSearch(criteria);
    
    			searchData.options.pageLength = parseInt(searchData.options.pageLength);
    
    			currentSearch = {
    				data: searchData
    			};
    
    			var $inputs = $('');
    
    			_.forEach(criteria, function (crit, i) {
    				if (crit.type == 'range') {
    					for (var j = 0; j <= 1; j++) {
    						$inputs = $inputs.add($('<input>').attr('name', crit.value[j].name).val(crit.value[j].value));
    					}
    				} else {
    					$inputs = $inputs.add($('<input>').attr('name', crit.name).val(crit.value));
    				}
    			});
    			currentSearch.$inputs = $inputs;
    
    			irma.records.main.index = search.index;
    			irma.records.main.totalResults = 0;
    
    			$('.search-results-container').addClass('-loading');
    
    			irma.newSearch = true;
    
    			customGUI = {
    				columns: searchData.guiColumns,
    				title: searchData.guiTitle,
    				id: searchData.guiId
    			};
    			irma.settings.save('customGUI', customGUI);
    
    			submitSearch(currentSearch.$inputs, searchData);
    		}
    		else {
    			searchData = $('.search-form').data();
    
    			if (!searchData.fixedSearch) {
    				newFilter();
    			}
    
    			customGUI = {
    				columns: searchData.guiColumns,
    				title: searchData.guiTitle,
    				id: searchData.guiId
    			};
    			irma.settings.save('customGUI', customGUI);
    		}
    
    		// ------
    
    		$(document).on('click', '.js-refine-search', function (e) {
    			e.stopPropagation();
    
    			$('.js-refine-dropdown').toggleClass('-active');
    		
    		}).on('submit', '.search-form:not(.js-simple-search)', function (e) {
    			e.preventDefault();
    
    			var $inputs = $(this).find('input:not(".advanced-search-input")').filter(function (i) {
    				return $(this).val().length > 0 && $(this).attr('name');
    			});
    
    			var data = $(this).data();
    			data.simpleSearch = false;
    
    			data.options.pageLength = parseInt(data.options.pageLength);
    
    			currentSearch = {
    				$inputs: $inputs,
    				data: data
    			};
    
    			irma.records.main.index = 0;
    			irma.records.main.totalResults = 0;
    
    			$('.search-results-container').addClass('-loading');
    
    			irma.newSearch = true;
    
    			submitSearch($inputs, data);
    			saveSearch("", $(this), true);
    
    		}).on('submit', '.js-simple-search', function (e) {
    			e.preventDefault();
    
    			var $inputs = $(this).find('input[name]').filter(function (i) {
    				return $(this).val().length > 0;
    			});
    
    			var data = $(this).data();
    			data.simpleSearch = true;
    
    			data.options.pageLength = parseInt(data.options.pageLength);
    
    			currentSearch = {
    				$inputs: $inputs,
    				data: data
    			};
    
    			irma.records.main.index = 0;
    			irma.records.main.totalResults = 0;
    
    			$('.search-results-container').addClass('-loading');
    
    			irma.newSearch = true;
    
    			submitSearch($inputs, data);
    			saveSearch("", $(this), true);
    
    		}).on('click', '.js-new-filter', function () {
    			newFilter(null, $(this).closest('.search-box'));
    		
    		}).on('click', '.js-remove-filter', function () {
    			removeFilter($(this).closest('.search-box'));
    		
    		}).on('click focus', '.search-form .filter-select.js-dropdown', function () {
    			showDropdown($(this));
    
    		}).on('click', '.search-form .filter-select .filter-item', function () {
    			updateDropdown();
    			
    			var $searchBox = $(this).closest('.search-box');
    			
    			var data = $(this).data();
    
    			updateFilter($searchBox, data);
    
    		}).on('click', '.js-refine-search', function () {
    			toggleSearch(false);
    
    		});
    
    		// Custom GUI
    
    		$(document).on('click', '.js-gui-new', function () {
    			var valid = !(irma.form.validateInput($(this).closest('.js-modal').find('[data-required] input')));
    
    			if (valid) {
    				var $scope = $(this).closest('.modal'),
    					title = $scope.find('.save-field input').val(),
    					$checked = $scope.find('input[type=\'checkbox\']').filter(':checked'),
    					data = [],
    					currentGUI = $scope.is('.modal-gui-new') ? null : irma.storage.get('userSettings').customGUI,
    					totalWidth = 0;
    
    				$checked.each(function (i) {
    					var $field = $(this).closest('.table-row'),
    						$input = $field.find('input[type=\'text\']'),
    						name = $input.attr('name'),
    						id = $field.data().id,
    						width;
    
    					data[i] = {
    						name: name,
    						title: $input.val(),
    						id: id
    					};
    					if (currentGUI) {
    						var currentField = _.filter(currentGUI.columns, { name: name, id: id });
    
    						if (currentField.length) {
    							width = parseInt(currentField[0].width);
    						}
    						else {
    							width = 100 / $checked.length;
    						}
    					}
    					else {
    						width = 100 / $checked.length;
    					}
    					totalWidth += width;
    					data[i].width = width;
    				});
    
    				if (totalWidth != 100) {
    					var ratio = 100 / totalWidth;
    
    					_.forEach(data, function (column, i) {
    						data[i].width = data[i].width * ratio;
    					});
    				}
    
    				loadGUI({ columns: data, title: title });
    
    				saveGUI(title, data);
    
    				irma.modal.closeModal($scope);
    			}
    
    		}).on('click', '.js-select-my-gui', function () {
    			$('.js-select-my-gui').removeClass('-active');
    			$(this).addClass('-active');
    
    		}).on('click', '.js-load-gui', function () {			
    			var data = $(this).closest('.modal').find('.js-select-my-gui.-active').data();
    
    			if (!data.gui[0].width) {
    				var width = 100 / data.gui.length;
    
    				_.forEach(data.gui, function (datum, i) {
    					data.gui[i] = {
    						name: datum.name,
    						title: datum.title,
    						width: width
    					};
    				});
    			}
    
    			var customGUI = {
    				title: data.title,
    				id: data.id,
    				columns: data.gui
    			};
    
    			loadGUI(customGUI);
    		});
    
    		// Save/load search
    
    		$(document).on('click', '.js-save-search', function () {
    			var valid = !(irma.form.validateInput($(this).closest('.js-modal').find('[data-required] input')));
    			var title = $(this).closest('.js-modal').find('input[name=\'save-search-title\']').val();
    
    			if (valid) {
    				saveSearch(title, $('.search-form'));
    			}
    
    		}).on('click', '.js-save-as', function () {
    			toggleSaveAs($(this).closest('.js-modal'));
    
    		}).on('click', '.js-load-search', function () {			
    			var data = $(this).closest('.modal').find('.js-select-my-search.-active').data().filters;
    
    			loadSearch(data);
    
    		}).on('click', '.js-btn-save-search', function () {
    			var $modal = $('.js-modal[data-modal=\'save-search\']');
    			
    			$modal.find('input').val('');
    			toggleSaveAs($modal, true);
    
    		}).on('click', '.js-btn-load-search', function () {
    			loadSavedSearches($('.js-modal[data-modal=\'load-search\']'));
    
    		}).on('click', '.js-select-my-search', function () {
    			$('.js-select-my-search').removeClass('-active');
    			$(this).addClass('-active');
    		}).on('click', '[data-modal=\'save-search\'] .js-select-my-search', function () {
    			var name = $(this).find('.table-cell:first-child').text(),
    				$modal = $(this).closest('.js-modal');
    
    			$modal.find('.form-field').removeClass('-invalid')
    				.find('input').val(name);
    		}).on('keyup change', '.save-field input', function (e) {
    			var $modal = $(this).closest('.js-modal');
    
    			$modal.find('.js-select-my-search.-active').removeClass('-active');
    		});
    
    		// Other
    
    		$(document).on('click', '.js-table-sort', function (e) {
    			sortBy($(this).closest('.table-cell'));
    		});
    
    		// ajax table 
    
    		$('.ajax-table .search-form').each(function () {
    			var data = $(this).data();
    			var $inputs = $(this).find('input[name]');
    
    			data.options.pageLength = parseInt(data.options.pageLength);
    
    			currentSearch = {
    				$inputs: $inputs,
    				data: data
    			};
    
    			irma.records.main.index = 0;
    			irma.records.main.totalResults = 0;
    
    			$('.search-results-container').addClass('-loading');
    
    			irma.newSearch = true;
    			submitSearch($inputs, data);
    		});
    	};
    
    	return {
    		init: init,
    		exportResults: exportResults,
    		sortRecords: sortRecords,
    		getRecords: getRecords,
    		loadSavedSearches: loadSavedSearches,
    		newGUI: newGUI,
    		loadGUIList: loadGUIList,
    		deleteGUI: deleteGUI,
    		submitSearch: submitSearch,
    		getCurrentSearch: getCurrentSearch,
    		toggleSearch: toggleSearch
    	};
    
    }());
  • URL: /components/raw/search-panel/search-panel.js
  • Filesystem Path: components/01-components/search-panel/search-panel.js
  • Size: 31.8 KB

There are no notes for this item.