sso looks working

This commit is contained in:
msyu
2025-09-14 12:09:18 +03:00
commit 89ac26325d
149 changed files with 7763 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
<cfsilent>
<cfparam name="ATTRIBUTES.name"/>
<cfparam name="ATTRIBUTES.value" default="1"/>
<cfif structKeyExists(ATTRIBUTES,"checked")>
<cfset checked=!(ATTRIBUTES.checked EQ "0" OR ATTRIBUTES.checked EQ "")/>
<cfelse>
<cfset checked=!(ATTRIBUTES.container[ATTRIBUTES.name] EQ "0" OR ATTRIBUTES.container[ATTRIBUTES.name] EQ "")/>
</cfif>
<cfparam name="ATTRIBUTES.suffix" default=""/>
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
<cfset attributeList="name,value,checked,container,suffix,id,disabled"/>
</cfsilent><cfoutput><input type="checkbox" name="#ATTRIBUTES.name#"<!---
---><cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#ATTRIBUTES.value#"<!---
---><cfif checked> checked="checked"</cfif><!---
---><cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
passthrough additional attributes
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop>/></cfoutput><cfexit method="exittag"/>
+30
View File
@@ -0,0 +1,30 @@
<cfparam name="ATTRIBUTES.lang" type="string" default=""/>
<cfparam name="request.language" type="string" default=""/>
<cfif len(ATTRIBUTES.lang) AND #ATTRIBUTES.lang# NEQ #request.language#>
<cfexit method="exittag"/>
</cfif>
<cfif thisTag.executionMode IS "end">
<!--- <cfloop collection=#CALLER# item="item">
<cfset structInsert(variables, item, CALLER[item], false)/>
</cfloop> --->
<cfassociate basetag="cf_table" datacollection="columns"/>
<cfset attributeList=""/> <!--- *** сделать проброс атрибутов --->
<cfparam name="thisTag.th" type="array" default=#[{content="",field=""}]#/><!---контейнер для данных вложенного элемента TH. Предусмотрен только один элемент массива, остальные игнорируются--->
<!---<cfparam name="thisTag.td" type="array" default=#[{content="",field=""}]#/>--->
<cfparam name="thisTag.td" type="array" default=#thisTag.th#/><!---контейнер для данных вложенного элемента TD. Предусмотрен только один элемент массива, остальные игнорируются--->
<!---Зачем массив? - потому что массив вложенных тегов, а у нас считается только первый вложенный тег TD--->
<cfset ATTRIBUTES.td=#thisTag.td#/><!---поле, видное включающему тегу table в коллекции columns--->
<cfset ATTRIBUTES.th=#thisTag.th#/><!---поле, видное включающему тегу table в коллекции columns--->
<cfset ATTRIBUTES.content=thisTag.generatedContent/>
<cfparam name="ATTRIBUTES.field" default="#thisTag.td[1].field#"/><!---***---><!---настоящий атрибут - имя поля запроса (query) для ВЫВОДА, может задаваться как атрибут тега--->
<cfparam name="ATTRIBUTES.formatter" type="function" default=#function (x) {return x;}#/>
<cfparam name="ATTRIBUTES.sortable" type="boolean" default=true/>
<cfparam name="ATTRIBUTES.visible" type="boolean" default=true/>
<cfparam name="ATTRIBUTES.columnOrder" type="integer" default=0/>
<!--- Желательное поведение сортировки колонок: для некоторых колонок указан порядок, на этом месте они и оказываются. Не указан - идут в порядке появления в коде. Если 2 колонки с одним порядком сортировки, первой выводится та, которая первая по тексту. --->
</cfif>
+46
View File
@@ -0,0 +1,46 @@
<cfsilent>
<cfimport prefix="c" taglib="."/>
<!---*** идея включить титул в метаданные была не совсем пустой, но когда титул определяется в селекте, это не слишком удобно --->
<cfassociate basetag="cf_grid_head" datacollection="headersArray"/>
<cfset envelope=getBaseTagData('cf_grid_head',1)/>
<cfparam name="ATTRIBUTES.title" type="string" default="#envelope.ATTRIBUTES.titleMap[ATTRIBUTES.name].title#"/>
<cfparam name="ATTRIBUTES.name" type="string"/><!--- Заголовок указвается на том поле, по которому будет сортировка, а не на том, которе отображается --->
<cfparam name="ATTRIBUTES.arrows" type="boolean" default="Yes"/>
<cfset attributeList="name,arrows,title"/>
<!--- В данном случае реализован подход: дополнительные атрибуты передаются вниз.
Другой вариант - создавать атрибут extra, в который писать суффикс QueryString.
Первый подход, использованный здесь, позволяет иметь доступ к дополнительным атрибутам, но непонятно, зачем - ведь их имена все равно неизвестны.
Очевидный минус этого подхода - возможный конфликт имен с именами существующих атрибутов --->
<cfset extraAttributes=structNew()/>
<!--- дополнительные атрибуты родительского тега--->
<cfif StructKeyExists(envelope, "extraAttributes") AND isStruct(envelope.extraAttributes)>
<cfloop collection=#envelope.extraAttributes# item="attr">
<cfif NOT listFindNoCase(attributeList, attr)><!--- проверка относительно локальных атрибутов, чтобы их не перетереть--->
<cfset val="#structFind(envelope.extraAttributes, attr)#"/>
<cfif IsSimpleValue(val)>
<cfset structInsert(extraAttributes, attr, val)/>
</cfif>
</cfif>
</cfloop>
</cfif>
<cfloop collection=#ATTRIBUTES# item="attr">
<cfif NOT listFindNoCase(attributeList, attr)>
<cfset val="#structFind(ATTRIBUTES, attr)#"/>
<cfif IsSimpleValue(val)>
<cfset structInsert(extraAttributes, attr, val, "Yes")/><!--- локальные атрибуты перетрут родительские --->
</cfif>
</cfif>
</cfloop>
</cfsilent><cfif thisTag.executionMode is "end"><cfoutput>#ATTRIBUTES.title#
<cfif ATTRIBUTES.arrows><c:order_arrows sortArray=#envelope.ATTRIBUTES.sortArray# n=#envelope.ATTRIBUTES.titleMap[ATTRIBUTES.name].ordinal# attributeCollection=#extraAttributes#/></cfif></cfoutput></cfif>
+178
View File
@@ -0,0 +1,178 @@
<!--- combobox
v3.1 23.10.2020 support of list in multiple selection
v3.0 12.08.2016 ATTRIBUTES.readonly
v2.1 04.05.2016 ATTRIBUTES.disabled
v2 с форматным выводом
---><cfprocessingdirective suppresswhitespace="true">
<!---
<cfparam name="ATTRIBUTES.query" type="query"/>
<cfparam name="ATTRIBUTES.queryString" type="string"/>
<cfparam name="ATTRIBUTES.list" type="string"/>
--->
<cfparam name="ATTRIBUTES.DS" type="string" default="#request.DS#"/>
<cfparam name="ATTRIBUTES.combo"/><!--- имя контрола (name)--->
<cfparam name="ATTRIBUTES.key"/><!--- Имя ключевого поля---><!--- ограничение: не поддерживаем составные ключи --->
<cfparam name="ATTRIBUTES.display" default=""/><!--- имя поля резалтсета --->
<cfparam name="ATTRIBUTES.displayf" default=""/><!--- форматный вывод, поля резалтсета писать: ##field##, например "*##field1##:##field2##*" --->
<cfparam name="ATTRIBUTES.selected" default=""/><!--- в случае base64 - завернуто в base64--->
<cfparam name="ATTRIBUTES.base64" default="No"/><!---*** это архитектурная ошибка. Base64 is url unsafe. Но поскольку все передается POST-ом, обычно не проявляется --->
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
<cfparam name="ATTRIBUTES.style_selector" default=""/>
<cfparam name="ATTRIBUTES.style_spec" type="struct" default=#structNew()#/>
<cfparam name="ATTRIBUTES.class_selector" default=""/>
<cfparam name="ATTRIBUTES.class_spec" type="struct" default=#structNew()#/>
<cfparam name="ATTRIBUTES.flag_disabled" type="string" default=""/><!--- проверяется на > 0. Возможно, не следует отключать выбранное значение --->
<cfparam name="ATTRIBUTES.readonly" type="boolean" default="false"/><!--- в случае readonly выводится текст и скрытое поле с ID, если множественное выделение, то надо наверно выводить все выделенные элементы? --->
<cfparam name="ATTRIBUTES.extra" type="string" default=""/><!--- --->
<cfset attributeList="template,query,queryString,combo,key,display,displayf,selected,empty,DS,base64,disabled,style_selector,style_spec,class_selector,class_spec,flag_disabled,readonly,extra"/>
<cffunction name="escape64" returnType="string">
<cfargument name="val" type="string">
<cfif #ATTRIBUTES.base64#>
<cfreturn ToBase64(val)>
<cfelse>
<cfreturn val>
</cfif>
</cffunction>
<cffunction name="isSelected" returnType="boolean">
<!--- tests for presense of key (second arg) in passed array (first arg) or, if sel is simple value just compares key and sel.
Used for checking against multiple alternatives like "save" OR "saveAndClose"
--->
<cfargument name="sel">
<cfargument name="key">
<cfscript>
if (isArray(sel)) {
for(i=1; i <= ArrayLen(sel); i++){
if (sel[i]==key) {return true;}
}
return false;
} else { //считаем, что из сложных типов тут бывает только массив
if (!isSimpleValue(sel)) {return false;}
/*return (sel == key);*/
return listFind(sel,key);
}
</cfscript>
</cffunction>
<cffunction name="strSelected" returnType="string">
<cfargument name="sel">
<cfargument name="key">
<!---unsupported in CF8: <cfreturn (isSelected(sel,key)? " selected" : "")>--->
<cfif isSelected(sel,key)>
<cfreturn " selected">
<cfelse>
<cfreturn "">
</cfif>
</cffunction>
<!--- функция условного обертывания --->
<cffunction name="w" returnType="string">
<cfargument name="prefix"/>
<cfargument name="input"/>
<cfargument name="suffix" default=""/>
<cfif len(input) GT 0>
<cfreturn "#prefix##input##suffix#"/>
<cfelse>
<cfreturn ""/>
</cfif>
</cffunction>
<cffunction name="strAttribute" returnType="string">
<!---returns formatted string ' attribute="value"',
where attribute name is the first argument,
and value is taken from passed structure(third argument) by key (second argument)--->
<cfargument name="name"/>
<cfargument name="selector"/>
<cfargument name="spec" type="struct"/>
<cfif StructKeyExists(spec, selector)>
<cfreturn ' #name#="#structFind(spec, selector)#"'/>
<cfelse>
<cfreturn "">
</cfif>
</cffunction>
<!--- ---------------------------------------------------------------------------------- --->
<cfif structKeyExists(ATTRIBUTES,"query")>
<cfset qSel=ATTRIBUTES.query>
<cfelseif structKeyExists(ATTRIBUTES,"queryString")>
<cfquery name="qSel" datasource="#ATTRIBUTES.DS#">
#preserveSingleQuotes(ATTRIBUTES.queryString)#
</cfquery>
<cfelseif structKeyExists(ATTRIBUTES,"list")>
<cfset qSel=#queryNew("item")#/>
<cfloop list=#ATTRIBUTES.list# item="item">
<cfset queryAddRow(qSel,{"item":"#item#"})/>
</cfloop>
</cfif>
<!--- parse class specifications--->
<cfscript>
</cfscript>
<cfif ATTRIBUTES.readonly>
<cfif isArray(ATTRIBUTES.selected)>
<cfset selectedList=ArrayToList(ATTRIBUTES.selected)/>
<cfelse>
<cfset selectedList=ATTRIBUTES.selected/>
</cfif>
<cfquery name="qSelFiltered" dbtype="query">
select * from qSel where <cfif len(selectedList)>#ATTRIBUTES.key# in (#selectedList#)<cfelse>1=0</cfif>
</cfquery>
<cfoutput>
<div class="textbox-disabled" style="display:inline-block;"<cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop>>
<cfif qSelFiltered.recordCount GT 0>
<cfloop query="qSelFiltered"><!---
---><cfset key=evaluate("#ATTRIBUTES.key#")/><!---
---><cfset key=trim(escape64(key))/><!---
---><div><input type="hidden" name="#ATTRIBUTES.combo#" value="#key#"/>#Evaluate(ATTRIBUTES.display)#<cfset Evaluate("WriteOutput('#ATTRIBUTES.displayf#')")/></div>
</cfloop>
<cfelseif isDefined("ATTRIBUTES.empty")>
<input type="hidden" name="#ATTRIBUTES.combo#" value="#ATTRIBUTES.empty#"/><!-- #ATTRIBUTES.combo#: nothing selected -->
&nbsp;&nbsp;&nbsp;
<cfelse>
&nbsp;&nbsp;&nbsp;
</cfif>
</div>
</cfoutput>
<cfelse><!--- ATTRIBUTES.readonly --->
<cfoutput>
<select name="#ATTRIBUTES.combo#"<!---
passthrough additional attributes
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop><cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><cfif len(ATTRIBUTES.extra)>#ATTRIBUTES.extra#</cfif>>
<cfif isDefined("ATTRIBUTES.empty")>
<option value="#ATTRIBUTES.empty#"></option><!--- *** Надо было делать не пустое, а дефолтное значение, чтобы можно было ввести, например, {N/A, -1} --->
</cfif>
<cfloop query=qSel>
<cfset key=evaluate("#ATTRIBUTES.key#")/><!--- в контексте запроса, поэтому находится в цикле! *** не самый лучший способ в смысле производительности --->
<cfset key=trim(escape64(key))/>
<cfset str_sel=strSelected(ATTRIBUTES.selected, key)/>
<option value="#key#"#str_sel#<!---
---><cfif len(ATTRIBUTES.style_selector) GT 0>#strAttribute("style",
Evaluate(ATTRIBUTES.style_selector),ATTRIBUTES.style_spec)#</cfif><!---
---><cfif len(ATTRIBUTES.class_selector) GT 0>#strAttribute("class", Evaluate(ATTRIBUTES.class_selector),ATTRIBUTES.class_spec)#</cfif><!---
---><cfif len(ATTRIBUTES.flag_disabled) GT 0><cfif Evaluate(ATTRIBUTES.flag_disabled) GT 0> disabled="1"</cfif></cfif><!---
--->>#Evaluate(ATTRIBUTES.display)#<cfset Evaluate("WriteOutput('#ATTRIBUTES.displayf#')")/></option>
</cfloop>
</select>
</cfoutput>
</cfif>
</cfprocessingdirective><cfexit method="EXITTAG"/>
+21
View File
@@ -0,0 +1,21 @@
<cfsilent>
<cfparam name="ATTRIBUTES.name"/>
<cfif structKeyExists(ATTRIBUTES,"value")>
<cfset value=#ATTRIBUTES.value#/>
<cfelse>
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
</cfif>
<cfparam name="ATTRIBUTES.suffix" default=""/>
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
<cfparam name="ATTRIBUTES.format" default="YYYY-MM-DD"/>
<cfparam name="ATTRIBUTES.size" default="#len(ATTRIBUTES.format)#"/>
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
<cfset attributeList="name,value,container,suffix,id,format,size,disabled"/>
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#dateFormat(value, ATTRIBUTES.format)#" size="#ATTRIBUTES.size#"<cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
passthrough additional attributes
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop>/></cfoutput><cfexit method="exittag"/>
+29
View File
@@ -0,0 +1,29 @@
<cfsilent>
<cfparam name="ATTRIBUTES.name"/>
<cfif structKeyExists(ATTRIBUTES,"value")>
<cfset value=#ATTRIBUTES.value#/>
<cfelse>
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
</cfif>
<cfparam name="ATTRIBUTES.suffix" default=""/>
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
<cfparam name="ATTRIBUTES.dformat" default="YYYY-MM-DD"/>
<cfparam name="ATTRIBUTES.tformat" default="HH:MM"/>
<cfparam name="ATTRIBUTES.size" default="#len(ATTRIBUTES.dformat)+len(ATTRIBUTES.tformat)+1#"/>
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
<cfparam name="ATTRIBUTES.timeFirst" type="boolean" default="No"/>
<cfif ATTRIBUTES.timeFirst>
<cfset value="#timeFormat(value, ATTRIBUTES.tformat)# #dateFormat(value, ATTRIBUTES.dformat)#"/>
<cfelse>
<cfset value="#dateFormat(value, ATTRIBUTES.dformat)# #timeFormat(value, ATTRIBUTES.tformat)#"/>
</cfif>
<cfset attributeList="name,value,container,suffix,id,dformat,tformat,size,disabled"/>
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#value#" size="#ATTRIBUTES.size#"<cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
passthrough additional attributes
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop>/></cfoutput><cfexit method="exittag"/>
+18
View File
@@ -0,0 +1,18 @@
<!---moved to layout--->
<!---<cfif thisTag.executionMode IS "end" OR NOT thisTag.hasEndTag>
<cfparam name="ATTRIBUTES.backUrl" type="string" default="."/>
<cfparam name="ATTRIBUTES.enable" type="boolean" default="No"/>
<cfoutput>
<div class="row" style="margin:0px;">
<div class="col-sm-3" style="padding: 0px;">
<button type="submit" name="save" class="btn btn-secondary" style="width: 100%; padding: 6px 0px;"<cfif NOT ATTRIBUTES.enable> disabled</cfif>>#request.i18("Сохранить","Save")#</button>
</div>
<div class="col-sm-6" style="padding: 0px 5px;">
<button type="submit" name="saveAndClose" class="btn btn-secondary" style="width: 100%; padding: 6px 0px;"<cfif NOT ATTRIBUTES.enable> disabled</cfif>>#request.i18("Сохранить и закрыть","Save and Close")#</button>
</div>
<div class="col-sm-3" style="padding: 0px;">
<button type="button" name="close" class="btn btn-secondary" style="width: 100%; padding: 6px 0px;" onClick="document.location.href='#ATTRIBUTES.backUrl#'">#request.i18("Закрыть","Close")#</button>
</div>
</div>
</cfoutput>
</cfif>--->
+18
View File
@@ -0,0 +1,18 @@
<cfsilent>
<cfparam name="ATTRIBUTES.titleMap" default=#structNew()#/>
<cfparam name="ATTRIBUTES.sortArray" default=#arrayNew(1)#/>
<cfset attributeList="titleMap,sortArray"/>
<cfset extraAttributes=structNew()/>
<cfloop collection=#ATTRIBUTES# item="attr">
<cfif NOT listFindNoCase(attributeList, attr)>
<cfset val="#structFind(ATTRIBUTES, attr)#"/>
<cfif IsSimpleValue(val)>
<cfset structInsert(extraAttributes, attr, val)/>
</cfif>
</cfif>
</cfloop>
</cfsilent><!---
---><cfif thisTag.executionMode is "start"><tr><cfelseif thisTag.executionMode is "end"></tr></cfif>
+11
View File
@@ -0,0 +1,11 @@
<cfsilent>
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
<cfif NOT ATTRIBUTES.canWrite>
<cfexit method="exitTag"/>
</cfif>
<cfparam name="ATTRIBUTES.entity"/>
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
<cfparam name="ATTRIBUTES.extra" default=""/>
<cfparam name="ATTRIBUTES.fwx"/>
<cfparam name="ATTRIBUTES.title" default="создать"/>
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=-1<cfif len(ATTRIBUTES.extra)>&#ATTRIBUTES.extra#</cfif>&#ATTRIBUTES.fwx#" title="#ATTRIBUTES.title#" class="add"></a></cfoutput><cfexit method="exitTag"/>
+10
View File
@@ -0,0 +1,10 @@
<cfsilent>
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
<cfif NOT ATTRIBUTES.canWrite>
<cfexit method="exitTag"/>
</cfif>
<cfparam name="ATTRIBUTES.entity"/>
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
<cfparam name="ATTRIBUTES.id"/>
<cfparam name="ATTRIBUTES.fwx"/>
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#_del.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" title="удалить" name="#ATTRIBUTES.id#" class="del"></a></cfoutput><cfexit method="exitTag"/>
+9
View File
@@ -0,0 +1,9 @@
<!---***deprecated. Use link_view_edit---><cfsilent>
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
<cfparam name="ATTRIBUTES.entity"/>
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
<cfparam name="ATTRIBUTES.id"/>
<cfparam name="ATTRIBUTES.fwx"/>
<cfparam name="ATTRIBUTES.title_edit" default="редактировать"/>
<cfparam name="ATTRIBUTES.title_view" default="просмотреть"/>
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" name="#ATTRIBUTES.id#" <cfif ATTRIBUTES.canWrite>title="#ATTRIBUTES.title_edit#" class="edit"<cfelse>title="#ATTRIBUTES.title_view#" class="view"</cfif>></a></cfoutput><cfexit method="exitTag"/>
+6
View File
@@ -0,0 +1,6 @@
<cfsilent>
<cfparam name="ATTRIBUTES.entity"/>
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
<cfparam name="ATTRIBUTES.id"/>
<cfparam name="ATTRIBUTES.fwx"/>
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" title="просмотреть" name="#ATTRIBUTES.id#" class="view"></a></cfoutput><cfexit method="exitTag"/>
+9
View File
@@ -0,0 +1,9 @@
<cfsilent>
<cfparam name="ATTRIBUTES.canWrite" type="boolean" default="Yes"/>
<cfparam name="ATTRIBUTES.entity"/>
<cfparam name="ATTRIBUTES.key" default="#ATTRIBUTES.entity#_id"/>
<cfparam name="ATTRIBUTES.id"/>
<cfparam name="ATTRIBUTES.fwx"/>
<cfparam name="ATTRIBUTES.title_edit" default="редактировать"/>
<cfparam name="ATTRIBUTES.title_view" default="просмотреть"/>
</cfsilent><cfoutput><a href="#ATTRIBUTES.entity#.cfm?#ATTRIBUTES.key#=#ATTRIBUTES.id#&#ATTRIBUTES.fwx#" name="#ATTRIBUTES.id#" <cfif ATTRIBUTES.canWrite>title="#ATTRIBUTES.title_edit#" class="edit"<cfelse>title="#ATTRIBUTES.title_view#" class="view"</cfif>></a></cfoutput><cfexit method="exitTag"/>
+25
View File
@@ -0,0 +1,25 @@
<cfprocessingdirective suppressWhitespace="YES"><cfsilent>
<cfparam name="ATTRIBUTES.page" type="string"/>
<cfparam name="ATTRIBUTES.queryString" type="string" default=""/>
<cfparam name="ATTRIBUTES.acl" type="string" default=""/>
<cfparam name="ATTRIBUTES.label" type="string" default=""/>
<cfif structKeyExists(#ATTRIBUTES#,"external")>
<cfset class="menu-item-ext"/>
<cfset target=' target="_blank"'/>
<cfelse>
<cfset class="menu-item"/>
<cfset target=''/>
</cfif>
</cfsilent><!---
---><cfmodule template="../ac.cfm" obj="#ATTRIBUTES.acl#"><cfif NOT (request.thisPage EQ ATTRIBUTES.page)><cfsilent>
<cfif len(ATTRIBUTES.queryString)>
<cfset pageUrl="#ATTRIBUTES.page#?#ATTRIBUTES.queryString#"/>
<cfelse>
<cfset pageUrl="#ATTRIBUTES.page#"/>
</cfif>
</cfsilent><cfoutput><li class="#class#"><a href="#pageUrl#"#target#>#ATTRIBUTES.label#</a></li></cfoutput>
<cfelse><cfoutput><li class="selected">#ATTRIBUTES.label#</li></cfoutput></cfif><!---
---></cfmodule></cfprocessingdirective><cfexit method="EXITTAG"/>
+6
View File
@@ -0,0 +1,6 @@
<cfsilent>
<cfparam name="ATTRIBUTES.targetid"/>
<cfparam name="ATTRIBUTES.enabled" default="Yes"/>
<cfparam name="ATTRIBUTES.suffix" default=""/>
<cfparam name="ATTRIBUTES.title" default="Сейчас"/>
</cfsilent><cfoutput><button onclick="document.getElementById(#ATTRIBUTES.targetid#).value=""></</cfoutput><cfexit method="exittag"/>
+36
View File
@@ -0,0 +1,36 @@
<cfsilent>
<cfparam name="ATTRIBUTES.n" type="numeric"/>
<cfset attributeList="n,sortArray"/>
<cfset img_up="arr_up.png"/>
<cfset img_dn="arr_dn.png"/>
<cfset HIGHLIGHTED_CNT=2/>
<cfif isDefined("ATTRIBUTES.sortArray")>
<cfset i=1>
<cfloop condition="i LE HIGHLIGHTED_CNT AND i LE arrayLen(ATTRIBUTES.sortArray)">
<cftry>
<cfif ATTRIBUTES.sortArray[i].fld EQ ATTRIBUTES.n>
<cfif ATTRIBUTES.sortArray[i].asc>
<cfset img_up="arr_up#i#.png">
<cfelse>
<cfset img_dn="arr_dn#i#.png">
</cfif>
</cfif>
<cfcatch type="Any"></cfcatch>
</cftry>
<cfset i=i+1>
</cfloop>
</cfif>
<cfset extra_query_string=""/>
<cfloop collection=#ATTRIBUTES# item="attr">
<cfif NOT listFindNoCase(attributeList,attr)>
<cfset val="#structFind(ATTRIBUTES,attr)#"/>
<cfif IsSimpleValue(val)>
<cfset extra_query_string="#extra_query_string#&#attr#=#val#"/>
</cfif>
</cfif>
</cfloop>
</cfsilent><cfoutput><a href="?sort=#ATTRIBUTES.n#a#extra_query_string#" class="noprint" style="padding:2px;" title="по возрастанию"><img src="img/#img_up#" alt="по возрастанию"></a><a href="?sort=#ATTRIBUTES.n#d#extra_query_string#" title="по убыванию"><img src="img/#img_dn#" alt="по убыванию"></a></cfoutput><cfexit method="exittag"/>
+80
View File
@@ -0,0 +1,80 @@
<cfparam name="nStart" type="integer" default="1"/>
<cfparam name="ATTRIBUTES.recordCount" type="integer"/>
<cfparam name="ATTRIBUTES.recordsPerPage" type="integer"/>
<cfparam name="ATTRIBUTES.thisPage" type="string" default=""/>
<cfparam name="ATTRIBUTES.addtionalUrlParams" type="string" default=""/>
<cfparam name="ATTRIBUTES.self" type="string" default=""/>
<!---<cfparam name="ATTRIBUTES.fwx" type="string" default=""/>--->
<cfparam name="ATTRIBUTES.output" type="string" default="paginator"/>
<!--- Исключение: рассчитанный индекс страницы превышает количество существующих страниц - надо возвращаться на первую --->
<cfset nPages = Int((ATTRIBUTES.recordCount-1)/ATTRIBUTES.recordsPerPage)+1/>
<cfset nCurrentPage = Int((nStart-1)/ATTRIBUTES.recordsPerPage)+1/>
<cfif nStart GT ATTRIBUTES.recordCount>
<cfset nStart=1/>
</cfif>
<cfset UrlSuffix=""/>
<cfif len(ATTRIBUTES.addtionalUrlParams) GT 0>
<cfset UrlSuffix="&#ATTRIBUTES.addtionalUrlParams#"/>
</cfif>
<cfif len(ATTRIBUTES.self) GT 0>
<cfset UrlSuffix="&track=#ATTRIBUTES.self#"/>
</cfif>
<cfset somePages=3/>
<cfsavecontent variable="pages">
<cfif ATTRIBUTES.recordCount GT ATTRIBUTES.recordsPerPage>
<cfset doMerge = false/>
<cfloop index="i" from="1" to="#nPages#">
<cfset nPageStartRecordNum=(i-1)*ATTRIBUTES.recordsPerPage+1>
<!---
схема, которая обеспечивает дихотомический поиск
первые несколько страниц (не менее 2)
если есть разрыв - многоточие
посередине
если есть разрыв - многоточие
несколько страниц до текушей
текущую без ссылки
несколько страниц после текущей
если есть разрыв - многоточие
посередине
если есть разрыв - многоточие
последние несколько страниц
--->
<!---Можно сделать на многоточии ссылку на середину интервала!--->
<!---Хочется добиться, чтобы при хождении вперед-назад значения повторялись--->
<!---забавный эффект, когда остается разрыв в 1 страницу, а там все равно многоточие--->
<cfoutput>
<cfif i NEQ nCurrentPage>
<cfif i GT somePages AND (nCurrentPage-i) GT somePages>
<cfif NOT doMerge><!---*** неуклюже--->
<cfset nMidPage = ceiling(nCurrentPage/2)/>
<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a>&nbsp;<cfset doMerge=true/>
</cfif>
<cfelseif (i-nCurrentPage) GT somePages AND (nPages-i) GT somePages>
<cfif NOT doMerge>
<cfset nMidPage = ceiling((nCurrentPage+nPages)/2)/>
<cfset nMidStartRecord = (nMidPage-1)*ATTRIBUTES.recordsPerPage+1/>
<a href="#ATTRIBUTES.thisPage#?nStart=#nMidStartRecord##UrlSuffix#" title="#nMidPage#">...</a>&nbsp;<cfset doMerge=true/>
</cfif>
<cfelse>
<a href="#ATTRIBUTES.thisPage#?nStart=#nPageStartRecordNum##UrlSuffix#">#i#</a>&nbsp;
<cfset doMerge=false/>
</cfif>
<cfelse>
<b>#i#</b>&nbsp;
</cfif>
</cfoutput>
</cfloop>
</cfif>
</cfsavecontent>
<cfset "CALLER.#ATTRIBUTES.output#.links"=#pages#/>
<cfset "CALLER.#ATTRIBUTES.output#.recordsPerPage"=#ATTRIBUTES.recordsPerPage#/>
<cfexit method="exittag"/>
+154
View File
@@ -0,0 +1,154 @@
<cfimport prefix="c" taglib="."/>
<cfif thisTag.executionMode IS "end">
<!--- <cfloop collection=#CALLER# item="item">
<cfset structInsert(variables, item, CALLER[item], false)/>
</cfloop> --->
<cfparam name="ATTRIBUTES.query" type="query"/>
<cfparam name="ATTRIBUTES.recordsPerPage" type="integer" default="500"/>
<cfparam name="ATTRIBUTES.nStart" type="integer" default="1"/>
<cfparam name="ATTRIBUTES.titleMap" type="struct" default=srtuctNew()/><!---for definition see: field_set.cfm--->
<cfparam name="ATTRIBUTES.sortArray" type="array" default=arrayNew(1)/>
<cfset tableAttributeList="query,recordsPerPage,nStart,titleMap,sortArray"/>
<cfset colAttributeList="lang,th,td,content,field,formatter,sortable,visible,columnOrder"/>
<cfset tdAttributeList="content,field"/>
<cfparam name="thisTag.columns" type="array"/>
<cffunction name=reorderColumns output="No">
<!--- Вариант сортировки. Вынимаем все элементы с указанным порядком в отдельную коллекцию,
после чего вставляем их в оставшуюся коллекцию на указанные позиции.
нет смысла делать вид, что мы реализуем что-то универсальное
(поле для сортировки в совершенно конкретном поле структуры в массиве),
поэтому ничего не передаем в аргументах, спокойно ссылаемся на окружение--->
<cfset var tmpOrderedIndexes=ArrayNew(1)/>
<cfset var tmpUnorderedIndexes=ArrayNew(1)/>
<cfloop from=1 to=#arrayLen(thisTag.columns)# index="i">
<cfif thisTag.columns[i].columnOrder GT 0>
<cfset arrayAppend(tmpOrderedIndexes,i)/>
<cfelse>
<cfset arrayAppend(tmpUnorderedIndexes,i)/>
</cfif>
</cfloop>
<cfloop from=#arrayLen(tmpOrderedIndexes)# to=1 step=-1 index="i">
<!--- counting up-down preserves entry order for equal columnOrders --->
<cfset var pos=max(min(thisTag.columns[tmpOrderedIndexes[i]].columnOrder, len(tmpUnorderedIndexes)+1),1)/>
<cfset arrayInsertAt(tmpUnorderedIndexes,pos,tmpOrderedIndexes[i])/>
</cfloop>
<cfset var sortedColumns=ArrayNew(1)/>
<cfloop from=1 to=#arrayLen(tmpUnorderedIndexes)# index="i">
<cfset sortedColumns[i]=thisTag.columns[tmpUnorderedIndexes[i]]/>
</cfloop>
<cfreturn sortedColumns/>
</cffunction>
<cfset sortedColumns=reorderColumns()/>
<cfset thisTag.generatedContent=""/>
<table<!--- passthrough additional attributes
---><cfoutput><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(tableAttributeList,attr)<!--- AND isSimpleValue(structFind(ATTRIBUTES,attr))--->> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop></cfoutput>>
<thead>
<tr>
<cfloop array=#sortedColumns# index="column">
<cfset th=column.th[1]/>
<th<!--- атрибуты колонки передаются в TH, хотя это выглядит не очень нужным --->
<cfloop collection=#column# item="colAttr">
<cfif NOT listFindNoCase(colAttributeList,colAttr)><cfoutput>#colAttr#="#structFind(column,colAttr)#" </cfoutput></cfif>
</cfloop>>
<cfif len(column.field) AND column.sortable>
<c:order_arrows sortArray=#ATTRIBUTES.sortArray# n=#ATTRIBUTES.titleMap[column.field].ordinal#<!--- attributeCollection=#extraAttributes#--->/>
</cfif>
<cfif len(th.content)>
<cfset Evaluate("WriteOutput('#th.content#')")/>
<cfelseif len(column.field)>
<cfif structKeyExists(ATTRIBUTES.titleMap[column.field],"title")>
<cfoutput>#ATTRIBUTES.titleMap[column.field].title#</cfoutput>
</cfif>
</cfif>
</th>
</cfloop>
</tr>
</thead>
<tbody>
<cfoutput query=#ATTRIBUTES.query# maxrows=#ATTRIBUTES.recordsPerPage# startrow=#ATTRIBUTES.nStart#>
<tr>
<cfloop array=#sortedColumns# index="column">
<cfset td=column.td[1]/>
<td<!--- Если нужно передать атрибут в TD, можно ввести тег <C:TD class="r"/> только как плейсхолдер для атрибутов, а поле будет получено от колонки --->
<cfloop collection=#td# item="tdAttr">
<cfif NOT listFindNoCase(tdAttributeList,tdAttr)>#tdAttr#="#structFind(td,tdAttr)#" </cfif>
</cfloop>
><cfif len(td.content)><cfset Evaluate("WriteOutput('#td.content#')")/><!---#td.content#--->
<cfelseif len(td.field)>#ATTRIBUTES.query[td.field][currentRow]#
<cfelseif len(column.field)>#column.formatter(ATTRIBUTES.query[column.field][currentRow])#
</cfif></td>
</cfloop>
</tr>
</cfoutput>
</tbody>
</table>
<!--- <cfdump var=#variables#/> --->
</cfif>
<!--- <cfexit method="exitTag"/> --->
<cfscript>
/**
* Sorts an array of structures based on a key in the structures.
*
* @param aofS Array of structures.
* @param key Key to sort by.
* @param sortOrder Order to sort by, asc or desc.
* @param sortType Text, textnocase, or numeric.
* @param delim Delimiter used for temporary data storage. Must not exist in data. Defaults to a period.
* @return Returns a sorted array.
* @author Nathan Dintenfass (nathan@changemedia.com)
* @version 1, December 10, 2001
*/
function arrayOfStructsSort(aOfS,key){
//by default we'll use an ascending sort
var sortOrder = "asc";
//by default, we'll use a textnocase sort
var sortType = "textnocase";
//by default, use ascii character 30 as the delim
var delim = ".";
//make an array to hold the sort stuff
var sortArray = arraynew(1);
//make an array to return
var returnArray = arraynew(1);
//grab the number of elements in the array (used in the loops)
var count = arrayLen(aOfS);
//make a variable to use in the loop
var ii = 1;
//if there is a 3rd argument, set the sortOrder
if(arraylen(arguments) GT 2)
sortOrder = arguments[3];
//if there is a 4th argument, set the sortType
if(arraylen(arguments) GT 3)
sortType = arguments[4];
//if there is a 5th argument, set the delim
if(arraylen(arguments) GT 4)
delim = arguments[5];
//loop over the array of structs, building the sortArray
for(ii = 1; ii lte count; ii = ii + 1)
sortArray[ii] = aOfS[ii][key] & delim & ii;
//now sort the array
arraySort(sortArray,sortType,sortOrder);
//now build the return array
for(ii = 1; ii lte count; ii = ii + 1)
returnArray[ii] = aOfS[listLast(sortArray[ii],delim)];
//return the array
return returnArray;
}
</cfscript>
+15
View File
@@ -0,0 +1,15 @@
<cfif thisTag.executionMode IS "end">
<!--- <cfloop collection=#CALLER# item="item">
<cfset structInsert(variables, item, CALLER[item], false)/>
</cfloop> --->
<cfassociate basetag="cf_column" datacollection="td"/>
<cfset attributeList="field"/>
<cfparam name="ATTRIBUTES.field" default=""/>
<cfset ATTRIBUTES.content=thisTag.generatedContent/>
</cfif>
<!---<cfparam name="ATTRIBUTES.lang" type="string" default=""/>
<cfparam name="request.language" type="string" default=""/>
<cfif len(ATTRIBUTES.lang) AND #ATTRIBUTES.lang# NEQ #request.language#>
<cfexit method="exittag"/>
</cfif>--->
+20
View File
@@ -0,0 +1,20 @@
<cfsilent>
<cfparam name="ATTRIBUTES.name"/>
<cfif structKeyExists(ATTRIBUTES,"value")>
<cfset value=#ATTRIBUTES.value#/>
<cfelse>
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
</cfif>
<cfparam name="ATTRIBUTES.suffix" default=""/>
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
<cfparam name="ATTRIBUTES.size" default=""/>
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
<cfset attributeList="name,value,container,suffix,id,size,disabled"/>
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#value#"<cfif len(ATTRIBUTES.size)> size="#ATTRIBUTES.size#"</cfif><cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
passthrough additional attributes
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop>/></cfoutput><cfexit method="exittag"/>
+6
View File
@@ -0,0 +1,6 @@
<cfif thisTag.executionMode IS "end">
<cfassociate basetag="cf_column" datacollection="th"/>
<cfset attributeList="field"/>
<cfparam name="ATTRIBUTES.field" default=""/>
<cfset ATTRIBUTES.content=thisTag.generatedContent/>
</cfif>
+21
View File
@@ -0,0 +1,21 @@
<cfsilent>
<cfparam name="ATTRIBUTES.name"/>
<cfif structKeyExists(ATTRIBUTES,"value")>
<cfset value=#ATTRIBUTES.value#/>
<cfelse>
<cfset value=#ATTRIBUTES.container[ATTRIBUTES.name]#/>
</cfif>
<cfparam name="ATTRIBUTES.suffix" default=""/>
<cfparam name="ATTRIBUTES.id" default="#ATTRIBUTES.name##ATTRIBUTES.suffix#"/>
<cfparam name="ATTRIBUTES.format" default="HH:MM"/>
<cfparam name="ATTRIBUTES.size" default="#len(ATTRIBUTES.format)#"/>
<cfparam name="ATTRIBUTES.disabled" type="boolean" default="No"/>
<cfset attributeList="name,value,container,suffix,id,format,size,disabled"/>
</cfsilent><cfoutput><input type="text" name="#ATTRIBUTES.name#"<cfif len(ATTRIBUTES.id)> id=#ATTRIBUTES.id#</cfif> value="#timeFormat(value, ATTRIBUTES.format)#" size="#ATTRIBUTES.size#"<cfif ATTRIBUTES.disabled> disabled="disabled"</cfif><!---
passthrough additional attributes
---><cfloop collection=#ATTRIBUTES# item="attr"><!---
---><cfif NOT listFindNoCase(attributeList,attr)> #attr#="#structFind(ATTRIBUTES,attr)#"</cfif><!---
---></cfloop>/></cfoutput><cfexit method="exittag"/>