source: branches/work_311/doc/DocSchemaDetails.cpp @ 607

Revision 607, 74.8 KB checked in by jls17, 5 years ago (diff)
  • resolving open-window-schema actions was done twice (1st; while documenting the action itself and 2nd; during schema documentation to show open-window-actions) and not in the same way, which did lead to divergent results; now a ref-item is created during action-documentation and the schema-documentation does just look for/list the ref-items. As a result open-window actions using $SCHEMA$ (with sample data) on multiple attached forms do create a reference on every attached form.
Line 
1//Copyright (C) 2009 Stefan Nerlich | stefan.nerlich@hotmail.com
2//
3//This file is part of ARInside.
4//
5//    ARInside is free software: you can redistribute it and/or modify
6//    it under the terms of the GNU General Public License as published by
7//    the Free Software Foundation, version 2 of the License.
8//
9//    ARInside is distributed in the hope that it will be useful,
10//    but WITHOUT ANY WARRANTY; without even the implied warranty of
11//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12//    GNU General Public License for more details.
13//
14//    You should have received a copy of the GNU General Public License
15//    along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
16
17#include "stdafx.h"
18#include "DocSchemaDetails.h"
19#include "DocFieldDetails.h"
20#include "../output/CsvPage.h"
21#include "../output/ImageTag.h"
22#include "../output/TabControl.h"
23#include "../output/URLLink.h"
24#include "../output/WorkflowReferenceTable.h"
25#include "../core/ARDayStructHelper.h"
26#include "../core/ARHandle.h"
27#include "../core/OpenWindowReportData.h"
28#include "../core/OpenWindowSampleData.h"
29#include "../util/Context.h"
30#include "DocOverlayHelper.h"
31#include "DocMain.h"
32
33#include "rapidjson/document.h"
34#include "rapidjson/genericwritestream.h"
35#include "rapidjson/writer.h"
36
37using namespace rapidjson;
38
39CDocSchemaDetails::CDocSchemaDetails(unsigned int schemaInsideId, int rootLevel)
40: schema(schemaInsideId)
41{
42        this->uniqueAlList.clear();
43        this->uniqueEscalList.clear();
44        this->uniqueFilterList.clear();
45        this->overlayType = 0;
46}
47
48CDocSchemaDetails::~CDocSchemaDetails(void)
49{
50}
51
52void CDocSchemaDetails::Documentation()
53{
54        try
55        {
56                CPageParams file(PAGE_DETAILS, &this->schema);
57                rootLevel = file->GetRootLevel();
58                string path = file->GetPath();
59
60                FileSystemUtil fsUtil(this->pInside->appConfig);
61                if(fsUtil.CreateSubDirectory(path)>=0)
62                {
63                        //stringstream pgStrm; 
64                        CWebPage webPage(file->GetFileName(), this->schema.GetName(), rootLevel, this->pInside->appConfig);
65                        CDocOverlayHelper overlayHelper(schema, rootLevel);
66                       
67                        const ARCompoundSchema& compSchema = this->schema.GetCompound();
68                        overlayType = schema.GetOverlayType();
69
70                        //ContentHead informations
71                        stringstream contHeadStrm;
72                        contHeadStrm << CWebUtil::LinkToSchemaIndex(rootLevel, false) << endl;
73                        contHeadStrm << MenuSeparator << this->pInside->LinkToSchemaTypeList(compSchema.schemaType, rootLevel) << endl;
74                        contHeadStrm << MenuSeparator << ImageTag(schema, rootLevel) << CWebUtil::ObjName(this->schema.GetName());
75                        contHeadStrm << CAREnum::GetOverlayTypeString(overlayType);
76
77                        if(!this->schema.GetAppRefName().empty())
78                                contHeadStrm << MenuSeparator << " Application " << this->pInside->LinkToContainer(this->schema.GetAppRefName(), rootLevel);
79
80                        webPage.AddContentHead(contHeadStrm.str(), overlayHelper.PlaceOverlayLink());
81                        webPage.AddContent(overlayHelper.PlaceOverlaidNotice());
82
83                        // add the javascript we need for this page to display correctly
84                        webPage.GetReferenceManager()
85                                .AddScriptReference("img/object_list.js")
86                                .AddScriptReference("img/schema_page.js")
87                                .AddScriptReference("img/jquery.timers.js")
88                                .AddScriptReference("img/jquery.address.min.js");
89
90                        // now the content
91                        CTabControl tabControl;
92
93                        // Add general schema informations to the page
94                        tabControl.AddTab("General", ShowGeneralInfo());
95
96                        // Add list of all fields to the page
97                        tabControl.AddTab("Fields", (IsJoinViewOrVendorForm() ? this->AllFieldsSpecial() : this->AllFields()) );
98
99                        // Add list of all views to the page
100                        tabControl.AddTab("Views", this->ShowVuiList());
101
102                        // Add a section which lists workflow thats reading data from this form
103                        tabControl.AddTab("Workflow", WorkflowDoc());
104
105                        // Add table with all references to the page
106                        tabControl.AddTab("References", GenerateReferencesTable(compSchema));
107
108                        webPage.AddContent(tabControl.ToXHtml());
109                        webPage.SaveInFolder(path);
110                }
111        }
112        catch(exception& e)
113        {
114                cout << "EXCEPTION schema details documentation of '"<< this->schema.GetName() << "': " << e.what() << endl;
115        }
116}
117
118//Create a page with all fields of this form
119string CDocSchemaDetails::AllFields()
120{               
121        CTable tbl("fieldListAll", "TblObjectList");
122        tbl.AddColumn(40, "Field Name");
123        tbl.AddColumn(10, "Field ID"); 
124        tbl.AddColumn(10, "Datatype");
125        tbl.AddColumn(10, "In Views");
126        tbl.AddColumn(10, "Modified");
127        tbl.AddColumn(20, "By");
128
129        try
130        {
131                CARFieldList* fields = schema.GetFields();
132                unsigned int fieldCount = fields->GetCount();
133                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
134                {
135                        CARField field(schema.GetInsideId(), 0, fieldIndex);
136
137                        CTableRow row("");
138
139                        CTableCell cellName(URLLink(field, rootLevel), "");
140                        CTableCell cellFieldId(field.GetFieldId(), "");
141                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
142
143                        stringstream strmTmp;
144                        if(field.GetDisplayInstances().numItems == 0 && field.GetFieldId() != 15)                               
145                                strmTmp << "<span class=\"fieldInNoView\">" << field.GetDisplayInstances().numItems << "</span>" << endl;
146                        else
147                                strmTmp << field.GetDisplayInstances().numItems;                       
148                        CTableCell cellNumViews(strmTmp.str(), "");                     
149
150                        CTableCell cellTimestamp(CUtil::DateTimeToHTMLString(field.GetTimestamp()), "");
151                        CTableCell cellLastChanged(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel), "");
152
153                        row.AddCell(cellName);
154                        row.AddCell(cellFieldId);
155                        row.AddCell(cellDataType);
156                        row.AddCell(cellNumViews);
157                        row.AddCell(cellTimestamp);
158                        row.AddCell(cellLastChanged);
159
160                        tbl.AddRow(row);
161                }
162
163                tbl.description = GenerateFieldTableDescription(tbl);
164
165                AllFieldsCsv();
166        }
167        catch(exception& e)
168        {
169                cout << "EXCEPTION schema all fields of '"<< this->schema.GetName() << "': " << e.what() << endl;
170        }
171
172        return tbl.ToXHtml();   
173}
174
175void CDocSchemaDetails::AllFieldsCsv()
176{               
177        CTable tbl("fieldListAll", "TblObjectList");
178        tbl.AddColumn(40, "Field Name");
179        tbl.AddColumn(10, "Field ID"); 
180        tbl.AddColumn(10, "Datatype");
181        tbl.AddColumn(10, "In Views");
182        tbl.AddColumn(10, "Modified");
183        tbl.AddColumn(20, "By");
184
185        try
186        {
187                CARFieldList* fields = schema.GetFields();
188                unsigned int fieldCount = fields->GetCount();
189                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
190                {
191                        CARField field(schema.GetInsideId(), 0, fieldIndex);
192
193                        CTableRow row("");
194                        CTableCell cellName(field.GetName(), "");
195                        CTableCell cellFieldId(field.GetFieldId(), "");
196                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");                   
197                        CTableCell cellNumViews(field.GetDisplayInstances().numItems, "");     
198                        CTableCell cellTimestamp(CUtil::DateTimeToString(field.GetTimestamp()), "");
199                        CTableCell cellLastChanged(field.GetLastChanged(), "");
200
201                        row.AddCell(cellName);         
202                        row.AddCell(cellFieldId);
203                        row.AddCell(cellDataType);
204                        row.AddCell(cellNumViews);
205                        row.AddCell(cellTimestamp);
206                        row.AddCell(cellLastChanged);
207
208                        tbl.AddRow(row);
209                }
210
211                //Save field information to ccs
212                CPageParams file(PAGE_SCHEMA_FIELDS_CSV, &this->schema);
213                CCsvPage csvPage(file->GetFileName(), this->pInside->appConfig);
214                csvPage.SaveInFolder(file->GetPath(), tbl.ToCsv());
215        }
216        catch(exception& e)
217        {
218                cout << "EXCEPTION schema all fields csv of '" << this->schema.GetName() << "': " << e.what() << endl;
219        }
220}
221
222void CDocSchemaDetails::AllFieldsJson(std::ostream &out)
223{
224        try
225        {
226                Document document;
227                Document::AllocatorType &alloc = document.GetAllocator();
228                document.SetArray();
229
230                CARFieldList* fields = schema.GetFields();
231                unsigned int fieldCount = fields->GetCount();
232                bool isSpecialForm = IsJoinViewOrVendorForm();
233
234                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
235                {
236                        CARField field(schema.GetInsideId(), 0, fieldIndex);
237                        CPageParams fieldLink(PAGE_DETAILS, &field);
238
239                        Value item;
240                        item.SetArray();
241
242                        string strName = field.GetName();
243                        string strDate = CUtil::DateTimeToString(field.GetTimestamp());
244                        string strLink = CWebUtil::DocName(fieldLink->GetFileName());
245
246                        Value name(strName.c_str(), static_cast<SizeType>(strName.size()), alloc);
247                        Value modified(strDate.c_str(), static_cast<SizeType>(strDate.size()), alloc);
248                        Value link(strLink.c_str(), static_cast<SizeType>(strLink.size()), alloc);
249
250                        item.PushBack(static_cast<int>(field.GetFieldId()), alloc);
251                        item.PushBack(name, alloc);
252                        item.PushBack(field.GetDataType(), alloc);
253                        item.PushBack(field.GetDisplayInstances().numItems, alloc);
254                        item.PushBack(modified, alloc);
255                        item.PushBack(field.GetLastChanged(), alloc);
256                        item.PushBack(link, alloc);
257                       
258                        // for special forms, we need some more details for the real-field column
259                        if (isSpecialForm)
260                        {
261                                switch (field.GetMapping().fieldType)
262                                {
263                                case AR_FIELD_JOIN:
264                                        {
265                                                if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
266                                                {
267                                                        const ARCompoundSchema& compSchema = this->schema.GetCompound();
268                                                        CARSchema schemaLeft(compSchema.u.join.memberA);
269                                                        CARSchema schemaRight(compSchema.u.join.memberB);
270
271                                                        CARField fldLeft(schemaLeft.GetInsideId(), 1);
272                                                        CARField fldRight(schemaRight.GetInsideId(), 1);
273
274                                                        CPageParams schemaLeftLink(PAGE_DETAILS, &schemaLeft);
275                                                        CPageParams schemaRightLink(PAGE_DETAILS, &schemaRight);
276                                                        CPageParams fldLeftLink(PAGE_DETAILS, &fldLeft);
277                                                        CPageParams fldRightLink(PAGE_DETAILS, &fldRight);
278
279                                                        string leftFieldName = fldLeft.GetName();
280                                                        string leftFieldLink = CWebUtil::GetRelativeURL(rootLevel, fldLeftLink);
281                                                        string leftSchemaName = schemaLeft.GetName();
282                                                        string leftSchemaLink = CWebUtil::GetRelativeURL(rootLevel, schemaLeftLink);
283                                                       
284                                                        string rightFieldName = fldRight.GetName();
285                                                        string rightFieldLink = CWebUtil::GetRelativeURL(rootLevel, fldRightLink);
286                                                        string rightSchemaName = schemaRight.GetName();
287                                                        string rightSchemaLink = CWebUtil::GetRelativeURL(rootLevel, schemaRightLink);
288
289                                                        Value leftNameVal(leftFieldName.c_str(), static_cast<SizeType>(leftFieldName.size()), alloc);
290                                                        Value leftLinkVal(leftFieldLink.c_str(), static_cast<SizeType>(leftFieldLink.size()), alloc);
291                                                        Value leftSchemaVal(leftSchemaName.c_str(), static_cast<SizeType>(leftSchemaName.size()), alloc);
292                                                        Value leftSchemaLinkVal(leftSchemaLink.c_str(), static_cast<SizeType>(leftSchemaLink.size()), alloc);
293
294                                                        Value rightNameVal(rightFieldName.c_str(), static_cast<SizeType>(rightFieldName.size()), alloc);
295                                                        Value rightLinkVal(rightFieldLink.c_str(), static_cast<SizeType>(rightFieldLink.size()), alloc);
296                                                        Value rightSchemaVal(rightSchemaName.c_str(), static_cast<SizeType>(rightSchemaName.size()), alloc);
297                                                        Value rightSchemaLinkVal(rightSchemaLink.c_str(), static_cast<SizeType>(rightSchemaLink.size()), alloc);
298
299                                                        item.PushBack(leftNameVal, alloc);
300                                                        item.PushBack(leftLinkVal, alloc);
301                                                        item.PushBack(leftSchemaVal, alloc);
302                                                        item.PushBack(leftSchemaLinkVal, alloc);
303
304                                                        item.PushBack(rightNameVal, alloc);
305                                                        item.PushBack(rightLinkVal, alloc);
306                                                        item.PushBack(rightSchemaVal, alloc);
307                                                        item.PushBack(rightSchemaLinkVal, alloc);
308                                                }
309                                                else
310                                                {
311                                                        if(field.GetMapping().u.join.realId > 0)
312                                                        {
313                                                                const ARCompoundSchema& compSchema = this->schema.GetCompound();
314
315                                                                string baseSchemaName = (field.GetMapping().u.join.schemaIndex == 0 ? compSchema.u.join.memberA : compSchema.u.join.memberB);
316                                                               
317                                                                CARSchema baseSchema(baseSchemaName);
318                                                                CPageParams baseSchemaPage(PAGE_DETAILS, &baseSchema);
319
320                                                                CARField baseField(baseSchema.GetInsideId(), field.GetMapping().u.join.realId);
321                                                                CPageParams baseFieldPage(PAGE_DETAILS, &baseField);
322
323                                                                string baseFieldName = baseField.GetName();
324                                                                string baseFieldLink = CWebUtil::GetRelativeURL(rootLevel, baseFieldPage);
325                                                                string baseSchemaLink = CWebUtil::GetRelativeURL(rootLevel, baseSchemaPage);
326                                                               
327                                                                Value baseFileNameVal(baseFieldName.c_str(), static_cast<SizeType>(baseFieldName.size()), alloc);
328                                                                Value baseFileLinkVal(baseFieldLink.c_str(), static_cast<SizeType>(baseFieldLink.size()), alloc);
329                                                                Value baseSchemaNameVal(baseSchemaName.c_str(), static_cast<SizeType>(baseSchemaName.size()), alloc);
330                                                                Value baseSchemaLinkVal(baseSchemaLink.c_str(), static_cast<SizeType>(baseSchemaLink.size()), alloc);
331
332                                                                item.PushBack(baseFileNameVal, alloc);
333                                                                item.PushBack(baseFileLinkVal, alloc);
334                                                                item.PushBack(baseSchemaNameVal, alloc);
335                                                                item.PushBack(baseSchemaLinkVal, alloc);
336
337                                                                //strmTmp << this->pInside->LinkToField(tmpBaseSchema, field.GetMapping().u.join.realId, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(tmpBaseSchema, rootLevel);
338                                                        }
339                                                        //else
340                                                        //      strmTmp << "&nbsp;";
341                                                }
342                                        }
343                                        break;
344                                case AR_FIELD_VIEW:
345                                        {
346                                                string val = field.GetMapping().u.view.fieldName;
347                                                Value itemVal(val.c_str(), static_cast<SizeType>(val.size()), alloc);
348                                                item.PushBack(itemVal, alloc);
349                                        }
350                                        break;
351                                case AR_FIELD_VENDOR:
352                                        {
353                                                string val = field.GetMapping().u.vendor.fieldName;
354                                                Value itemVal(val.c_str(), static_cast<SizeType>(val.size()), alloc);
355                                                item.PushBack(itemVal, alloc);
356                                        }
357                                        break;
358                                }
359
360                        }
361
362                        document.PushBack(item, alloc);
363                }
364
365                GenericWriteStream output(out);
366                Writer<GenericWriteStream> writer(output);
367
368                out << endl << "<script type=\"text/javascript\">" << endl;
369                out << "var schemaFieldList = "; document.Accept(writer); out << ";";
370                if (isSpecialForm)
371                {
372                        string type;
373                        switch (this->schema.GetCompound().schemaType)
374                        {
375                        case AR_SCHEMA_VIEW:
376                                type = "view";
377                                break;
378                        case AR_SCHEMA_VENDOR:
379                                type = "vendor";
380                                break;
381                        case AR_SCHEMA_JOIN:
382                                type = "join";
383                                break;
384                        }
385                        if (!type.empty())
386                        {
387                                out << "schemaFieldManager.setRenderer(\"" << type << "\");";
388                        }
389                }
390                out << endl;
391                out << "</script>" << endl;
392        }
393        catch(exception& e)
394        {
395                cout << "EXCEPTION schema all fields json of '" << this->schema.GetName() << "': " << e.what() << endl;
396        }
397}
398
399//Create a page with all fields of a joinform
400string CDocSchemaDetails::AllFieldsSpecial()
401{               
402        CTable tbl("fieldListAll", "TblObjectList");
403        tbl.AddColumn(20, "Field Name");
404        tbl.AddColumn(5, "Field ID");
405        tbl.AddColumn(5, "Datatype");
406        tbl.AddColumn(30, "Real Field");
407        tbl.AddColumn(10, "In Views");
408        tbl.AddColumn(10, "Modified");
409        tbl.AddColumn(20, "By");
410
411        try
412        {
413                CARFieldList* fields = schema.GetFields();
414                unsigned int fieldCount = fields->GetCount();
415                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
416                {
417                        CARField field(schema.GetInsideId(), 0, fieldIndex);
418
419                        CTableRow row("");
420                        CTableCell cellName(URLLink(field, rootLevel), "");
421                        CTableCell cellFieldId(field.GetFieldId(), "");
422
423                        stringstream strmTmp;
424                        if(field.GetDisplayInstances().numItems == 0 && field.GetFieldId() != 15)                               
425                                strmTmp << "<span class=\"fieldInNoView\">" << field.GetDisplayInstances().numItems << "</span" << endl;
426                        else
427                                strmTmp << field.GetDisplayInstances().numItems;                       
428                       
429                        CTableCell cellNumViews(strmTmp.str(), "");     
430                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
431
432                        strmTmp.str("");                       
433                        switch (field.GetMapping().fieldType)
434                        {
435                        case AR_FIELD_JOIN:
436                                {
437                                        if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
438                                        {
439                                                const ARCompoundSchema& compSchema = this->schema.GetCompound();
440                                                strmTmp << this->pInside->LinkToField(compSchema.u.join.memberA, 1, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(compSchema.u.join.memberA, rootLevel);
441                                                strmTmp << "<br/>" << endl;
442                                                strmTmp << this->pInside->LinkToField(compSchema.u.join.memberB, 1, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(compSchema.u.join.memberB, rootLevel);
443                                        }
444                                        else
445                                        {
446                                                if(field.GetMapping().u.join.realId > 0)
447                                                {
448                                                        string tmpBaseSchema = this->schema.GetCompound().u.join.memberA;
449                                                        if(field.GetMapping().u.join.schemaIndex > 0)
450                                                                tmpBaseSchema = this->schema.GetCompound().u.join.memberB;
451
452                                                        strmTmp << this->pInside->LinkToField(tmpBaseSchema, field.GetMapping().u.join.realId, rootLevel) << "&nbsp;" << MenuSeparator << "&nbsp;" << this->pInside->LinkToSchema(tmpBaseSchema, rootLevel);
453                                                }
454                                                else
455                                                        strmTmp << "&nbsp;";
456                                        }
457                                }
458                                break;
459                        case AR_FIELD_VIEW:
460                                strmTmp << field.GetMapping().u.view.fieldName;
461                                break;
462                        case AR_FIELD_VENDOR:
463                                strmTmp << field.GetMapping().u.vendor.fieldName;
464                                break;
465                        }
466
467                        CTableCell cellFieldRealId(strmTmp.str(), "");
468                        CTableCell cellTimestamp(CUtil::DateTimeToHTMLString(field.GetTimestamp()), "");
469                        CTableCell cellLastChanged(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel), "");
470
471                        row.AddCell(cellName);
472                        row.AddCell(cellFieldId);
473                        row.AddCell(cellDataType);
474                        row.AddCell(cellFieldRealId);
475                        row.AddCell(cellNumViews);
476                        row.AddCell(cellTimestamp);
477                        row.AddCell(cellLastChanged);
478
479                        tbl.AddRow(row);
480                }
481
482                tbl.description = GenerateFieldTableDescription(tbl);
483
484                AllFieldsSpecialCsv();
485        }
486        catch(exception& e)
487        {
488                cout << "EXCEPTION schema all fields join of '"<< this->schema.GetName() << "': " << e.what() << endl;
489        }
490
491        return tbl.ToXHtml();   
492}
493
494void CDocSchemaDetails::AllFieldsSpecialCsv()
495{               
496        CTable tbl("fieldListAll", "TblObjectList");
497        tbl.AddColumn(20, "Field Name");
498        tbl.AddColumn(5, "Field ID");
499        tbl.AddColumn(5, "Datatype");
500        tbl.AddColumn(30, "Real Field");
501        tbl.AddColumn(10, "In Views");
502        tbl.AddColumn(10, "Modified");
503        tbl.AddColumn(20, "By");
504
505        try
506        {
507                CARFieldList* fields = schema.GetFields();
508                unsigned int fieldCount = fields->GetCount();
509                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
510                {
511                        CARField field(schema.GetInsideId(), 0, fieldIndex);
512
513                        CTableRow row("");
514                        CTableCell cellName(field.GetName(), "");
515                        CTableCell cellFieldId(field.GetFieldId(), "");
516                        CTableCell cellNumViews(field.GetDisplayInstances().numItems, "");
517                        CTableCell cellDataType(CAREnum::DataType(field.GetDataType()), "");
518
519                        stringstream strmTmp;
520                        switch (field.GetMapping().fieldType)
521                        {
522                        case AR_FIELD_JOIN:
523                                {
524                                        if(field.GetFieldId() == 1) // RequestID 1 in Joinform = ReqId1 | ReqId2
525                                        {
526                                                strmTmp << 1;
527                                        }
528                                        else
529                                        {
530                                                if(field.GetMapping().u.join.realId > 0)
531                                                {
532                                                        strmTmp << field.GetMapping().u.join.realId;
533                                                }
534                                        }
535                                }
536                                break;
537                        case AR_FIELD_VIEW:
538                                {
539                                        strmTmp << field.GetMapping().u.view.fieldName;
540                                }
541                                break;
542                        case AR_FIELD_VENDOR:
543                                {
544                                        strmTmp << field.GetMapping().u.vendor.fieldName;
545                                }
546                                break;                 
547                        }
548
549                        CTableCell cellFieldRealId(strmTmp.str());
550                        CTableCell cellTimestamp(CUtil::DateTimeToString(field.GetTimestamp()), "");
551                        CTableCell cellLastChanged(field.GetLastChanged(), "");
552
553                        row.AddCell(cellName);
554                        row.AddCell(cellFieldId);
555                        row.AddCell(cellDataType);
556                        row.AddCell(cellFieldRealId);
557                        row.AddCell(cellNumViews);
558                        row.AddCell(cellTimestamp);
559                        row.AddCell(cellLastChanged);
560
561                        tbl.AddRow(row);
562                }
563
564                //Save field information to csv
565                CPageParams file(PAGE_SCHEMA_FIELDS_CSV, &this->schema);
566                CCsvPage csvPage(file->GetFileName(), this->pInside->appConfig);
567                csvPage.SaveInFolder(file->GetPath(), tbl.ToCsv());
568        }
569        catch(exception& e)
570        {
571                cout << "EXCEPTION schema all fields join csv of '" << this->schema.GetName() << "': " << e.what() << endl;
572        }
573}
574
575string CDocSchemaDetails::GenerateFieldTableDescription(CTable &tbl)
576{
577        stringstream outputStrm;
578        AllFieldsJson(outputStrm);
579        outputStrm << "<div><span class='clearable'><input type=\"text\" class='data_field' id=\"fieldNameFilter\" placeholder=\"search by name or id\"/></span><button id=\"execFieldFilter\">Filter</button></div>" << endl;
580        outputStrm << ImageTag(ImageTag::Document, rootLevel) << "<span id='fieldListFilterResultCount'></span>" << tbl.NumRows() << " fields (" << URLLink("data", CPageParams(PAGE_SCHEMA_FIELDS_CSV, &this->schema), rootLevel) << ")" << endl;
581        outputStrm << "<div id=\"result\"></div>";
582        return outputStrm.str();
583}
584
585bool CDocSchemaDetails::InAlList(string objName)
586{
587        list<string>::iterator listIter;               
588        for ( listIter = this->uniqueAlList.begin(); listIter != this->uniqueAlList.end(); listIter++ )
589        {
590                string *listItemName = &(*listIter);
591                if(strcmp(objName.c_str(), listItemName->c_str())==0)
592                {
593                        return true;
594                }
595        }
596        return false;
597}
598
599bool CDocSchemaDetails::InFilterList(string objName)
600{
601        list<string>::iterator listIter;               
602        for ( listIter = this->uniqueFilterList.begin(); listIter != this->uniqueFilterList.end(); listIter++ )
603        {
604                string *listItemName = &(*listIter);
605                if(strcmp(objName.c_str(), listItemName->c_str())==0)
606                {
607                        return true;
608                }
609        }
610        return false;
611}
612
613bool CDocSchemaDetails::InEscalList(string objName)
614{
615        list<string>::iterator listIter;               
616        for ( listIter = this->uniqueEscalList.begin(); listIter != this->uniqueEscalList.end(); listIter++ )
617        {
618                string *listItemName = &(*listIter);
619                if(strcmp(objName.c_str(), listItemName->c_str())==0)
620                {
621                        return true;
622                }
623        }
624        return false;
625}
626
627bool CDocSchemaDetails::IsSchemaInWFConnectStruct(const ARWorkflowConnectStruct& wfCS)
628{
629        if (wfCS.type == AR_WORKFLOW_CONN_SCHEMA_LIST && wfCS.u.schemaList != NULL)
630        {
631                for (unsigned int connectIndex = 0; connectIndex < wfCS.u.schemaList->numItems; ++connectIndex)
632                {
633                        if (schema.GetName() == wfCS.u.schemaList->nameList[connectIndex])
634                        {
635                                return true;
636                        }
637                }
638        }
639        return false;
640}
641
642void AddJsonRow(Document &doc, CARActiveLink &al, int rootLevel)
643{
644        CPageParams alDetailPage(PAGE_DETAILS, &al);
645        Document::AllocatorType &alloc = doc.GetAllocator();
646        Value item;
647        item.SetArray();
648
649        string strModDate, strActlinkName, strLink;
650        strModDate = CUtil::DateTimeToString(al.GetTimestamp());
651        strActlinkName = al.GetName();
652        strLink = CWebUtil::GetRelativeURL(rootLevel, alDetailPage);
653
654        Value modDate, alName, alLink;
655        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
656        alName.SetString(strActlinkName.c_str(), static_cast<SizeType>(strActlinkName.length()), alloc);
657        alLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
658
659        item.PushBack((al.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
660        item.PushBack(alName, alloc);
661        item.PushBack((al.GetEnabled() ? true : false), alloc);
662        item.PushBack(al.GetOrder(), alloc);
663        item.PushBack(al.GetExecuteMask(), alloc);
664        item.PushBack(al.GetIfActions().numItems, alloc);
665        item.PushBack(al.GetElseActions().numItems, alloc);
666        item.PushBack(modDate, alloc);
667        item.PushBack(al.GetLastChanged(), alloc);
668        item.PushBack(alLink, alloc);
669       
670        doc.PushBack(item, alloc);
671}
672
673void AddJsonRow(Document &doc, CARFilter &flt, int rootLevel)
674{
675        CPageParams fltDetailPage(PAGE_DETAILS, &flt);
676        Document::AllocatorType &alloc = doc.GetAllocator();
677        Value item;
678        item.SetArray();
679
680        string strModDate, strName, strLink;
681        strModDate = CUtil::DateTimeToString(flt.GetTimestamp());
682        strName = flt.GetName();
683        strLink = CWebUtil::GetRelativeURL(rootLevel, fltDetailPage);
684
685        Value modDate, objName, objLink;
686        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
687        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
688        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
689
690        item.PushBack((flt.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
691        item.PushBack(objName, alloc);
692        item.PushBack((flt.GetEnabled() ? true : false), alloc);
693        item.PushBack(flt.GetOrder(), alloc);
694        item.PushBack(flt.GetOperation(), alloc);
695        item.PushBack(flt.GetIfActions().numItems, alloc);
696        item.PushBack(flt.GetElseActions().numItems, alloc);
697        item.PushBack(modDate, alloc);
698        item.PushBack(flt.GetLastChanged(), alloc);
699        item.PushBack(objLink, alloc);
700       
701        doc.PushBack(item, alloc);
702}
703
704void AddJsonRow(Document &doc, CAREscalation &esc, int rootLevel)
705{
706        CPageParams escDetailPage(PAGE_DETAILS, &esc);
707        Document::AllocatorType &alloc = doc.GetAllocator();
708        Value item;
709        item.SetArray();
710
711        string strModDate, strName, strLink;
712        strModDate = CUtil::DateTimeToString(esc.GetTimestamp());
713        strName = esc.GetName();
714        strLink = CWebUtil::GetRelativeURL(rootLevel, escDetailPage);
715
716        Value modDate, objName, objLink;
717        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
718        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
719        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
720
721        item.PushBack((esc.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
722        item.PushBack(objName, alloc);
723        item.PushBack((esc.GetEnabled() ? true : false), alloc);
724        item.PushBack("", alloc);
725        item.PushBack(esc.GetTimeStruct().escalationTmType, alloc);
726        item.PushBack(esc.GetIfActions().numItems, alloc);
727        item.PushBack(esc.GetElseActions().numItems, alloc);
728        item.PushBack(modDate, alloc);
729        item.PushBack(esc.GetLastChanged(), alloc);
730        item.PushBack(objLink, alloc);
731       
732        doc.PushBack(item, alloc);
733}
734
735void AddJsonRow(Document &doc, CARContainer &cnt, int rootLevel)
736{
737        CPageParams cntDetailPage(PAGE_DETAILS, &cnt);
738        Document::AllocatorType &alloc = doc.GetAllocator();
739        Value item;
740        item.SetArray();
741
742        string strModDate, strName, strLink;
743        strModDate = CUtil::DateTimeToString(cnt.GetTimestamp());
744        strName = cnt.GetName();
745        strLink = CWebUtil::GetRelativeURL(rootLevel, cntDetailPage);
746
747        Value modDate, objName, objLink;
748        modDate.SetString(strModDate.c_str(), static_cast<SizeType>(strModDate.length()), alloc);
749        objName.SetString(strName.c_str(), static_cast<SizeType>(strName.length()), alloc);
750        objLink.SetString(strLink.c_str(), static_cast<SizeType>(strLink.length()), alloc);
751
752        item.PushBack((cnt.GetServerObjectTypeXML()-AR_STRUCT_XML_OFFSET), alloc);
753        item.PushBack(objName, alloc);
754        item.PushBack(cnt.GetType(), alloc);
755        item.PushBack("", alloc);
756        item.PushBack("", alloc);
757        item.PushBack("", alloc);
758        item.PushBack("", alloc);
759        item.PushBack(modDate, alloc);
760        item.PushBack(cnt.GetLastChanged(), alloc);
761        item.PushBack(objLink, alloc);
762       
763        doc.PushBack(item, alloc);
764}
765
766string CDocSchemaDetails::WorkflowDoc()
767{
768        try
769        {
770                //CPageParams file(PAGE_SCHEMA_WORKFLOW, &this->schema);
771
772                Document document;
773                document.SetArray();
774
775                //Field references
776                CTable tblRef("referenceList", "TblObjectList");
777                tblRef.AddColumn(35, "Server object");
778                tblRef.AddColumn(05, "Enabled");
779                tblRef.AddColumn(05, "Order");
780                tblRef.AddColumn(15, "Execute On");
781                tblRef.AddColumn(05, "If");
782                tblRef.AddColumn(05, "Else");
783                tblRef.AddColumn(15, "Changed");
784                tblRef.AddColumn(15, "By");
785
786                const CARSchemaList::ObjectRefList& alList = this->schema.GetActiveLinks();
787                const CARSchemaList::ObjectRefList& fltList = this->schema.GetFilters();
788                const CARSchemaList::ObjectRefList& escList = this->schema.GetEscalations();
789                const CARSchemaList::ObjectRefList& algList = this->schema.GetActLinkGuides();
790                const CARSchemaList::ObjectRefList& flgList = this->schema.GetFilterGuides();
791                const CARSchemaList::ObjectRefList& wbsList = this->schema.GetWebservices();
792
793                // Add all active links
794                CARSchemaList::ObjectRefList::const_iterator curIt = alList.begin();
795                CARSchemaList::ObjectRefList::const_iterator endIt = alList.end();
796                for (; curIt != endIt; ++curIt)
797                {
798                        CARActiveLink al(*curIt);
799                        AddJsonRow(document, al, rootLevel);
800                }
801
802                // Add all filters
803                curIt = fltList.begin();
804                endIt = fltList.end();
805                for (; curIt != endIt; ++curIt)
806                {
807                        CARFilter flt(*curIt);
808                        AddJsonRow(document, flt, rootLevel);
809                }
810
811                // Add all escalations
812                curIt = escList.begin();
813                endIt = escList.end();
814                for (; curIt != endIt; ++curIt)
815                {
816                        CAREscalation esc(*curIt);
817                        AddJsonRow(document, esc, rootLevel);
818                }
819
820                // add all active link guides
821                curIt = algList.begin();
822                endIt = algList.end();
823                for (; curIt != endIt; ++curIt)
824                {
825                        CARContainer alg(*curIt);
826                        AddJsonRow(document, alg, rootLevel);
827                }
828
829                // add all filter guides
830                curIt = flgList.begin();
831                endIt = flgList.end();
832                for (; curIt != endIt; ++curIt)
833                {
834                        CARContainer flg(*curIt);
835                        AddJsonRow(document, flg, rootLevel);
836                }
837
838                // add all webservices
839                curIt = wbsList.begin();
840                endIt = wbsList.end();
841                for (; curIt != endIt; ++curIt)
842                {
843                        CARContainer ws(*curIt);
844                        AddJsonRow(document, ws, rootLevel);
845                }
846
847                // generate json output struct
848                stringstream strm;
849                GenericWriteStream genericStream(strm);
850                Writer<GenericWriteStream> genericWriter(genericStream);
851
852                strm << "<script type=\"text/javascript\">" << "var schemaWFLInit = false;" << endl;
853                strm << "var referenceList = "; document.Accept(genericWriter); strm << ";" << endl
854                     << "var rootLevel = " << rootLevel << endl
855                     << "</script>" << endl
856                                 << CDocMain::CreateSchemaReferenceFilterControl() << endl
857                     << tblRef;
858                return strm.str();
859        }
860        catch(exception& e)
861        {
862                cout << "EXCEPTION schema workflow doc of '" << this->schema.GetName() << "': " << e.what() << endl;
863                return "";
864        }
865}
866
867//list of groups with access rights
868void CDocSchemaDetails::ShowPermissionProperties(std::ostream &strm, CARProplistHelper *propIndex)
869{
870        try
871        {
872                //CPageParams file(PAGE_SCHEMA_PERMISSIONS, &this->schema);
873
874                CTable tbl("permissionList", "TblObjectList");
875                tbl.AddColumn(60, "Group Name");
876                tbl.AddColumn(20, "Group Id");
877                tbl.AddColumn(20, "Permission");
878
879                const ARPermissionList& perms = this->schema.GetPermissions();
880                for(unsigned int i = 0; i < perms.numItems; ++i)
881                {
882                        if(this->pInside->ValidateGroup(this->schema.GetAppRefName(), perms.permissionList[i].groupId))
883                        {
884                                CTableRow row("");
885                                stringstream perm;
886
887                                if(perms.permissionList[i].permissions == AR_PERMISSIONS_HIDDEN)
888                                        perm << ImageTag(ImageTag::Hidden, rootLevel);
889                                else
890                                        perm << ImageTag(ImageTag::Visible, rootLevel);
891
892                                perm << CAREnum::ObjectPermission(perms.permissionList[i].permissions);
893
894                                row.AddCell(CTableCell(this->pInside->LinkToGroup(this->schema.GetAppRefName(), perms.permissionList[i].groupId, rootLevel)));
895                                row.AddCell(CTableCell(perms.permissionList[i].groupId));
896                                row.AddCell(perm.str());
897                                tbl.AddRow(row);
898                        }
899                }
900
901                //CPageParams file(PAGE_SCHEMA_SUBADMINS, &this->schema); //////////////////////////////////
902                CTable tblSubAdm("subadminPerms", "TblObjectList");
903                tblSubAdm.AddColumn(90, "Group Name");
904                tblSubAdm.AddColumn(10, "Group Id");
905
906                const ARInternalIdList& subAdmins = schema.GetSubadmins();
907                for(unsigned int i = 0; i < subAdmins.numItems; ++i)
908                {
909                        CTableRow row("");
910                        row.AddCell(this->pInside->LinkToGroup(this->schema.GetAppRefName(), subAdmins.internalIdList[i], rootLevel));
911                        row.AddCell(subAdmins.internalIdList[i]);
912                        tblSubAdm.AddRow(row);
913                }
914
915                //Show all fields with all group permissions
916                CTable tblFieldPerm("fieldPerms", "TblObjectList");
917
918                tblFieldPerm.AddColumn(40, "Field Name");
919                tblFieldPerm.AddColumn(10, "Field ID"); 
920                tblFieldPerm.AddColumn(10, "Datatype");         
921                tblFieldPerm.AddColumn(40, "Permissions");
922
923
924                CARFieldList* fields = schema.GetFields();
925                unsigned int fieldCount = fields->GetCount();
926                for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
927                {
928                        CARField field(schema.GetInsideId(), 0, fieldIndex);
929
930                        //Field Permissions
931                        stringstream strmFieldPermissions;
932                        strmFieldPermissions.str("");
933
934                        const ARPermissionList& fldPerms = field.GetPermissions();
935                        if(fldPerms.numItems > 0)
936                        {
937                                CTable tblFieldPermissionDetails("PermissionFieldList", "TblHidden");
938                                tblFieldPermissionDetails.AddColumn(50, "Group Name");
939                                tblFieldPermissionDetails.AddColumn(50, "Permission");
940                                tblFieldPermissionDetails.DisableHeader();
941
942                                for(unsigned int i = 0; i < fldPerms.numItems; ++i)
943                                {
944                                        stringstream perm;
945                                       
946                                        if(fldPerms.permissionList[i].permissions == AR_PERMISSIONS_CHANGE)
947                                                perm << ImageTag(ImageTag::Edit, rootLevel);
948                                        else
949                                                perm << ImageTag(ImageTag::Visible, rootLevel);
950
951                                        perm << CAREnum::FieldPermission(fldPerms.permissionList[i].permissions);
952
953                                        CTableRow row("");
954                                        row.AddCell(this->pInside->LinkToGroup(schema.GetAppRefName(), fldPerms.permissionList[i].groupId, rootLevel));
955                                        row.AddCell(perm.str());
956                                        tblFieldPermissionDetails.AddRow(row);
957                                }
958
959                                strmFieldPermissions << tblFieldPermissionDetails;
960                        }
961                        else
962                        {
963                                strmFieldPermissions << EmptyValue << endl;
964                        }
965
966
967                        CTableRow row("");                     
968                        row.AddCell(CTableCell(URLLink(field, rootLevel)));
969                        row.AddCell(CTableCell(field.GetFieldId()));
970                        row.AddCell(CTableCell(CAREnum::DataType(field.GetDataType())));
971                        row.AddCell(CTableCell(strmFieldPermissions.str()));
972                        tblFieldPerm.AddRow(row);
973                }
974
975                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Permissions" << "</h2>";
976                strm << "<div id='schemaPermissions'>" 
977                         << "<h2>" << "Group Permissions" << "</h2>" << "<div>" << tbl << "</div>"
978             << "<h2>" << "Subadministrator Permissions" << "</h2>" << "<div>" << tblSubAdm << "</div>"
979             << "<h2>" << "Field Permissions" << "</h2>" << "<div>" << tblFieldPerm << "</div>"
980                     << "</div>";
981        }
982        catch(exception& e)
983        {
984                cout << "EXCEPTION schema permission doc of '" << this->schema.GetName() << "': " << e.what() << endl;
985        }
986}
987
988//Create a page that shows a list of all indexes
989void CDocSchemaDetails::ShowIndexProperties(std::ostream &strm, CARProplistHelper *propIndex)
990{
991        try
992        {
993                //CPageParams file(PAGE_SCHEMA_INDEXES, &this->schema);
994
995                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Indexes" << "</h2>";
996                strm << "<div>";
997
998                const ARIndexList& indexList = this->schema.GetIndexList();
999                for(unsigned int nIndex=0; nIndex < indexList.numItems; ++nIndex)
1000                {               
1001                        CTable tbl("indexTbl", "TblObjectList");
1002                        tbl.AddColumn(0, "Field Name");
1003                        tbl.AddColumn(0, "Field ID");
1004                        tbl.AddColumn(0, "Datatype");
1005                        tbl.AddColumn(0, "Modified");
1006                        tbl.AddColumn(0, "By");
1007
1008                        stringstream tblDesc;
1009                        if(indexList.indexList[nIndex].unique)
1010                                tblDesc << "Unique Index :" << CWebUtil::ObjName(indexList.indexList[nIndex].indexName);
1011                        else
1012                                tblDesc << "Index: " << CWebUtil::ObjName(indexList.indexList[nIndex].indexName);
1013
1014                        tbl.description = tblDesc.str();
1015
1016                        for(unsigned int nField=0; nField < indexList.indexList[nIndex].numFields; ++nField)
1017                        {
1018                                CARField field(schema.GetInsideId(), indexList.indexList[nIndex].fieldIds[nField]);
1019
1020                                if (field.Exists())
1021                                {
1022                                        CTableRow row("");
1023                                        row.AddCell( CTableCell(URLLink(field, rootLevel)));
1024                                        row.AddCell( CTableCell(field.GetFieldId()));
1025                                        row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));
1026                                        row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetDataType())));
1027                                        row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1028                                        tbl.AddRow(row);
1029
1030                                        //Add a reference
1031                                        CRefItem refItem(this->schema, 0, nIndex, REFM_SCHEMA_INDEX);
1032                                        pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1033                                }
1034                        }
1035
1036                        strm << tbl;
1037                }
1038
1039                strm << "</div>";
1040        }
1041        catch(exception& e)
1042        {
1043                cout << "EXCEPTION creating schema index doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1044        }
1045}
1046
1047//Create a page that shows the form resultlist
1048void CDocSchemaDetails::ShowResultListProperties(std::ostream &strm, CARProplistHelper *propIndex)
1049{
1050        try
1051        {
1052                CTable tbl("fieldListIndex", "TblObjectList");
1053                tbl.AddColumn(25, "Field Name");
1054                tbl.AddColumn(10, "Field Id");
1055                tbl.AddColumn(10, "Datatype");
1056                tbl.AddColumn(5, "Width");
1057                tbl.AddColumn(10, "Separator");
1058                tbl.AddColumn(20, "Modified");
1059                tbl.AddColumn(20, "By");
1060
1061                const AREntryListFieldList& resultFields = schema.GetResultFields();
1062                for(unsigned int i = 0; i < resultFields.numItems; ++i)
1063                {
1064                        CARField field(schema.GetInsideId(), resultFields.fieldsList[i].fieldId);
1065
1066                        if (field.Exists())
1067                        {
1068                                CTableRow row("");
1069                                row.AddCell( CTableCell(URLLink(field, rootLevel)));
1070                                row.AddCell( CTableCell(field.GetFieldId()));
1071                                row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));
1072                                row.AddCell( CTableCell(resultFields.fieldsList[i].columnWidth));
1073                                row.AddCell( CTableCell(resultFields.fieldsList[i].separator));
1074                                row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetTimestamp())));
1075                                row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1076                                tbl.AddRow(row);
1077
1078                                //Add a reference
1079                                CRefItem refItem(this->schema, REFM_SCHEMA_RESULTLIST);
1080                                pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1081                        }
1082                }
1083
1084                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Result List Fields" << "</h2>";
1085                strm << "<div>" << tbl << "</div>";
1086        }
1087        catch(exception& e)
1088        {
1089                cout << "EXCEPTION creating schema resultlist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1090        }
1091}
1092
1093//Create a page that shows the page sortslist
1094void CDocSchemaDetails::ShowSortListProperties(std::ostream &strm, CARProplistHelper *propIndex)
1095{
1096        try
1097        {
1098                //CPageParams file(PAGE_SCHEMA_SORTLIST, &this->schema);
1099
1100                CTable tbl("fieldListIndex", "TblObjectList");
1101                tbl.AddColumn(10, "Sort Order");
1102                tbl.AddColumn(30, "Field Name");
1103                tbl.AddColumn(10, "Field Id");
1104                tbl.AddColumn(10, "Datatype");
1105                tbl.AddColumn(20, "Modified");
1106                tbl.AddColumn(20, "By");
1107
1108
1109                const ARSortList& sorting = schema.GetSortList();
1110                for(unsigned int i = 0; i < sorting.numItems; ++i)
1111                {
1112                        CARField field(schema.GetInsideId(), sorting.sortList[i].fieldId);
1113
1114                        if (field.Exists())
1115                        {
1116                                CTableRow row("");
1117
1118                                string sortImage;
1119                                if(sorting.sortList[i].sortOrder == AR_SORT_DESCENDING)
1120                                        sortImage = ImageTag(ImageTag::SortDesc, rootLevel);
1121                                else
1122                                        sortImage = ImageTag(ImageTag::SortAsc, rootLevel);
1123
1124                                row.AddCell( CTableCell(sortImage));
1125                                row.AddCell( CTableCell(URLLink(field, rootLevel)));
1126                                row.AddCell( CTableCell(field.GetFieldId()));
1127                                row.AddCell( CTableCell(CAREnum::DataType(field.GetDataType())));                               
1128                                row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(field.GetTimestamp())));
1129                                row.AddCell( CTableCell(this->pInside->LinkToUser(field.GetLastChanged(), rootLevel)));
1130
1131                                tbl.AddRow(row);
1132
1133                                //Add a reference
1134                                CRefItem refItem(this->schema, REFM_SCHEMA_SORTLIST);
1135                                pInside->AddFieldReference(schema.GetInsideId(), field.GetInsideId(), refItem);
1136                        }
1137                }
1138
1139                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Sort" << "</h2>";
1140                strm << "<div>" << tbl << "</div>";
1141        }
1142        catch(exception& e)
1143        {
1144                cout << "EXCEPTION creating schema sortlist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1145        }
1146}
1147
1148//Create a page with a list of all views
1149string CDocSchemaDetails::ShowVuiList()
1150{       
1151        try
1152        {
1153                //CPageParams file(PAGE_OVERVIEW, AR_STRUCT_ITEM_XML_VUI, &this->schema);
1154
1155                CTable tbl("vuiList", "TblObjectList");
1156                tbl.AddColumn(30, "Vui Name");
1157                tbl.AddColumn(20, "Label");
1158                tbl.AddColumn(10, "Web Alias");
1159                tbl.AddColumn(10, "Type");
1160                tbl.AddColumn(15, "Modified");
1161                tbl.AddColumn(15, "By");
1162
1163                unsigned int vuiCount = schema.GetVUIs()->GetCount();
1164                for (unsigned int vuiIndex = 0; vuiIndex < vuiCount; ++vuiIndex)
1165                {
1166                        CARVui vui(schema.GetInsideId(), 0, vuiIndex);
1167
1168                        CTableRow row("");                     
1169                        row.AddCell( CTableCell(URLLink(vui, rootLevel)));
1170                        row.AddCell( CTableCell(vui.Label()));
1171                        row.AddCell( CTableCell(vui.webAlias()));
1172                        row.AddCell( CTableCell(CAREnum::VuiType(vui.GetType())));
1173                        row.AddCell( CTableCell(CUtil::DateTimeToHTMLString(vui.GetTimestamp())));
1174                        row.AddCell( CTableCell(this->pInside->LinkToUser(vui.GetLastChanged(), rootLevel)));
1175                        tbl.AddRow(row);
1176                }
1177
1178                stringstream strm;
1179                strm << tbl;
1180                return strm.str();
1181        }
1182        catch(exception& e)
1183        {
1184                cout << "EXCEPTION creating schema vuilist doc of '" << this->schema.GetName() << "': " << e.what() << endl;
1185                return "";
1186        }
1187}
1188
1189string CDocSchemaDetails::TypeDetails()
1190{
1191        stringstream strm;
1192        strm.str("");
1193
1194        try
1195        {
1196                const ARCompoundSchema& compSchema = schema.GetCompound();
1197                switch(compSchema.schemaType)
1198                {
1199                case AR_SCHEMA_JOIN:
1200                        {
1201                                strm << "(" << this->pInside->LinkToSchema(compSchema.u.join.memberA, rootLevel) << " <-> " << this->pInside->LinkToSchema(compSchema.u.join.memberB, rootLevel) << ")" << "<br/>";
1202
1203                                if(compSchema.u.join.joinQual.operation != AR_COND_OP_NONE)
1204                                {
1205                                        stringstream strmQuery;
1206                                        CARSchema memberA(compSchema.u.join.memberA);
1207                                        CARSchema memberB(compSchema.u.join.memberB);
1208                                        CRefItem refItem(this->schema, REFM_SCHEMA_JOIN_QUALIFICATION);
1209
1210                                        CARQualification arQual(*this->pInside, refItem, memberA.GetInsideId(), memberB.GetInsideId(), rootLevel);
1211                                        arQual.CheckQuery(&compSchema.u.join.joinQual, strmQuery);
1212
1213                                        strm << "Qualification: " << strmQuery.str();
1214                                }
1215                        }
1216                        break;
1217                case AR_SCHEMA_VIEW:
1218                        {
1219                                strm << "<span class='additionalInfo'>" << "(" << "Table&nbsp;Name: " << compSchema.u.view.tableName << " &nbsp;&nbsp;&nbsp; "
1220                                     << "Key&nbsp;Field: " << compSchema.u.view.keyField << ")" << "</span>";
1221                        }
1222                        break;                 
1223                case AR_SCHEMA_VENDOR:
1224                        {
1225                                strm << "<span class='additionalInfo'>" << "(" << "Plugin:&nbsp;" << compSchema.u.vendor.vendorName << " &nbsp;&nbsp;&nbsp; ";
1226                                strm << "Table: " << compSchema.u.vendor.tableName << ")" << "</span>";
1227                        }
1228                        break;
1229                default:
1230                        {
1231                                strm << EmptyValue;
1232                        }
1233                        break;
1234                }
1235        }
1236        catch(exception& e)
1237        {
1238                cout << "EXCEPTION enumerating regular schema type information of '" << this->schema.GetName() << "': " << e.what() << endl;
1239        }
1240        return strm.str();
1241}
1242
1243string CDocSchemaDetails::ContainerReferences()
1244{
1245        stringstream strm;
1246        strm.str("");
1247        try
1248        {
1249                //// Active Link Guides ////
1250                const CARSchemaList::ObjectRefList& alg = schema.GetActLinkGuides();
1251                CARSchemaList::ObjectRefList::const_iterator curIt = alg.begin();
1252                CARSchemaList::ObjectRefList::const_iterator endIt = alg.end();
1253
1254                CContainerTable *contTable = new CContainerTable(*this->pInside);
1255
1256                for (; curIt != endIt; ++curIt)
1257                {
1258                        CARContainer cont(*curIt);
1259                        contTable->AddRow(cont, rootLevel);
1260                }
1261
1262                //// Filter Guides ////
1263                const CARSchemaList::ObjectRefList& flg = schema.GetFilterGuides();
1264                curIt = flg.begin();
1265                endIt = flg.end();
1266
1267                for (; curIt != endIt; ++curIt)
1268                {
1269                        CARContainer cont(*curIt);
1270                        contTable->AddRow(cont, rootLevel);
1271                }
1272
1273                //// Packing Lists ////
1274                const CARSchemaList::ObjectRefList& pkl = schema.GetPackingLists();
1275                curIt = pkl.begin();
1276                endIt = pkl.end();
1277
1278                for (; curIt != endIt; ++curIt)
1279                {
1280                        CARContainer cont(*curIt);
1281                        contTable->AddRow(cont, rootLevel);
1282                }
1283
1284                const CARSchemaList::ObjectRefList& ws = schema.GetWebservices();
1285                curIt = ws.begin();
1286                endIt = ws.end();
1287
1288                for (; curIt != endIt; ++curIt)
1289                {
1290                        CARContainer cont(*curIt);
1291                        contTable->AddRow(cont, rootLevel);
1292                }
1293
1294                //// create output ////
1295                if(contTable->NumRows() > 0)
1296                        strm << *contTable;
1297                else
1298                        strm << EmptyValue;
1299
1300                delete contTable;
1301        }
1302        catch(exception& e)
1303        {
1304                cout << "EXCEPTION enumerating container references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1305        }
1306
1307        return strm.str();
1308}
1309
1310string CDocSchemaDetails::JoinFormReferences()
1311{
1312        stringstream strm;
1313        strm.str("");
1314        try
1315        {
1316                const ARNameType& schemaName = this->schema.GetARName();
1317                unsigned int schemaCount = this->pInside->schemaList.GetCount();
1318                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1319                {
1320                        CARSchema schema(schemaIndex);
1321
1322                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(schema))
1323                                continue;
1324
1325                        const ARCompoundSchema& compSchema = schema.GetCompound();
1326
1327                        if(compSchema.schemaType == AR_SCHEMA_JOIN)
1328                        {
1329                                if(strcmp(schemaName, compSchema.u.join.memberA) == 0)
1330                                {
1331                                        strm << "Primary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1332                                }
1333
1334                                if(strcmp(schemaName, compSchema.u.join.memberB)==0)                                   
1335                                {
1336                                        strm << "Secondary Form in: " << URLLink(schema, rootLevel) << "<br/>" << endl;
1337                                }
1338                        }
1339                }
1340
1341                if(strm.str().size() == 0)
1342                        strm << EmptyValue;
1343        }
1344        catch(exception& e)
1345        {
1346                cout << "EXCEPTION enumerating join form references of '" << this->schema.GetName() << "': " << e.what() << endl;
1347        }
1348
1349        return strm.str();
1350}
1351
1352
1353string CDocSchemaDetails::TableFieldReferences()
1354{
1355        stringstream strm;
1356        strm.str("");
1357        try
1358        {
1359                // TODO: there is a function that checks for field references between table-field and column-field
1360                // before the documentation starts. Move this function over to this scanning routing and store
1361                // "table field to form" references in a list within the CARSchemaList
1362                // ===> move scaning over to CARInside::CustomFieldReferences
1363                bool bFound = false;
1364
1365                unsigned int schemaCount = pInside->schemaList.GetCount();
1366                for (unsigned int schemaIndex = 0; schemaIndex < schemaCount; ++schemaIndex)
1367                {                       
1368                        CARSchema searchSchema(schemaIndex);
1369                       
1370                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(searchSchema))
1371                                continue;
1372
1373                        unsigned int fieldCount = searchSchema.GetFields()->GetCount();
1374                        for (unsigned int fieldIndex = 0; fieldIndex < fieldCount; ++fieldIndex)
1375                        {
1376                                CARField field(schemaIndex, 0, fieldIndex);
1377                               
1378                                if(field.GetDataType() == AR_DATA_TYPE_TABLE && field.GetLimits().dataType == AR_DATA_TYPE_TABLE)
1379                                {
1380                                        const ARTableLimitsStruct &limit = field.GetLimits().u.tableLimits;                                     
1381                                        const char *tableSchema = limit.schema;
1382
1383                                        if (limit.schema[0] == '$')
1384                                                tableSchema = limit.sampleSchema;
1385
1386                                        if(schema.GetName().compare(tableSchema) == 0)
1387                                        {
1388                                                strm << "Table: " << URLLink(field, rootLevel);
1389                                                strm << " in form: " << URLLink(searchSchema, rootLevel) << "<br/>" << endl;
1390
1391                                                bFound = true;
1392                                        }
1393                                }
1394                        }
1395                }
1396
1397                if(!bFound)
1398                        strm << EmptyValue;
1399        }
1400        catch(exception& e)
1401        {
1402                cout << "EXCEPTION enumerating table references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1403        }
1404
1405        return strm.str();
1406}
1407
1408string CDocSchemaDetails::SearchMenuReferences()
1409{
1410        stringstream strm;
1411        strm.str("");
1412        try
1413        {
1414                CMenuTable *menuTable = new CMenuTable(*this->pInside);
1415
1416                const CARSchema::ReferenceList &refList = schema.GetReferences();
1417                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1418                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1419
1420                for (; curIt != endIt; ++curIt)
1421                {
1422                        if (curIt->GetMessageId() == REFM_CHARMENU_FORM && curIt->GetObjectType() == AR_STRUCT_ITEM_XML_CHAR_MENU)
1423                        {
1424                                CARHandle<CARCharMenu> hMenu(*curIt);
1425                                menuTable->AddRow(*hMenu, rootLevel);
1426                        }
1427                }
1428
1429                if(menuTable->NumRows() > 0)
1430                        strm << *menuTable;
1431                else
1432                        strm << EmptyValue;
1433
1434                delete menuTable;
1435        }
1436        catch(exception& e)
1437        {
1438                cout << "EXCEPTION enumerating search menu references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1439        }
1440
1441        return strm.str();
1442}
1443
1444string CDocSchemaDetails::AlWindowOpenReferences()
1445{
1446        stringstream strm;
1447        strm.str("");
1448        try
1449        {
1450                CAlTable *alTable = new CAlTable(*this->pInside);
1451
1452                const CARSchema::ReferenceList &references = schema.GetReferences();
1453                CARSchema::ReferenceList::const_iterator curIt = references.begin();
1454                CARSchema::ReferenceList::const_iterator endIt = references.end();
1455
1456                for (; curIt != endIt; ++curIt)
1457                {
1458                        if (curIt->GetMessageId() != REFM_OPENWINDOW_FORM && curIt->GetObjectType() != AR_STRUCT_ITEM_XML_ACTIVE_LINK)
1459                                continue;
1460
1461                        CARActiveLink al(curIt->GetObjectId());
1462
1463                        if (!al.Exists())
1464                                continue;
1465
1466                        if (pInside->appConfig.bOverlaySupport && !IsVisibleObject(al))
1467                                continue;
1468
1469                        alTable->AddRow(curIt->GetObjectId(), rootLevel);
1470                }
1471
1472                if(alTable->NumRows() > 0)
1473                        strm << *alTable;
1474                else
1475                        strm << EmptyValue;
1476
1477                delete alTable;
1478        }
1479        catch(exception& e)
1480        {
1481                cout << "EXCEPTION enumerating window open references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
1482        }
1483
1484        return strm.str();
1485}
1486
1487string CDocSchemaDetails::ShowProperties()
1488{
1489        stringstream strm;
1490        strm.str("");
1491        int schemaType = this->schema.GetCompound().schemaType;
1492       
1493        try
1494        {
1495                const ARPropList& propList = this->schema.GetPropList();
1496                CARProplistHelper propIdx(&propList);
1497
1498                strm << "<div id='schemaProperties'>";
1499
1500                // doc basic properties
1501                ShowBasicProperties(strm, &propIdx);
1502                ShowEntryPointProperties(strm, &propIdx);
1503
1504                if (schemaType != AR_SCHEMA_DIALOG)
1505                {
1506                        ShowResultListProperties(strm, &propIdx);
1507                        ShowSortListProperties(strm, &propIdx);
1508                        ShowArchiveProperties(strm);
1509
1510                        if (pInside->CompareServerVersion(7,0) >= 0) 
1511                        {
1512                                ShowAuditProperties(strm);
1513                        }
1514                       
1515                        if (schemaType != AR_SCHEMA_VENDOR && schemaType != AR_SCHEMA_VIEW)
1516                                ShowIndexProperties(strm, &propIdx);
1517
1518                        ShowFTSMTSProperties(strm, &propIdx);
1519                }
1520
1521                ShowPermissionProperties(strm, &propIdx);
1522
1523                propIdx.UnusedPropertiesToHTML(strm, rootLevel);
1524
1525                ShowChangeHistory(strm, &propIdx);
1526
1527                strm << "</div>";
1528        }
1529        catch(exception& e)
1530        {
1531                cerr << "EXCEPTION enumerating properties: " << e.what() << endl;
1532        }
1533        return strm.str();
1534}
1535
1536void CDocSchemaDetails::ShowBasicProperties(std::ostream& strm, CARProplistHelper* propIndex)
1537{
1538        ARValueStruct* propVal;
1539
1540        try
1541        {
1542                stringstream tmpStrm;
1543                CTable tbl("basicProps", "TblNoBorder");
1544                tbl.AddColumn(20, "Description");
1545                tbl.AddColumn(80, "Value");
1546                tbl.DisableHeader();
1547
1548                // entry id block size
1549                ARLong32 nextIDBlockSize = -1;
1550
1551                propVal = propIndex->GetAndUseValue(AR_OPROP_NEXT_ID_BLOCK_SIZE);
1552                if (propVal != NULL)
1553                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1554                                nextIDBlockSize = propVal->u.intVal;
1555
1556                tmpStrm.str("");
1557                tmpStrm << (nextIDBlockSize>0?"Enabled":"Disabled") << "<br/>";
1558                if (nextIDBlockSize>0)
1559                        tmpStrm << "Size: " << nextIDBlockSize;
1560
1561                CTableRow rowBS("");
1562                rowBS.AddCell("Next Request ID Block");
1563                rowBS.AddCell(tmpStrm.str());
1564                tbl.AddRow(rowBS);
1565
1566#if AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1567                // cache properties
1568                ARLong32 cacheDisplayProps = -1;
1569
1570                propVal = propIndex->GetAndUseValue(AR_OPROP_CACHE_DISP_PROP);
1571                if (propVal != NULL) 
1572                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1573                                cacheDisplayProps = propVal->u.intVal;
1574
1575                tmpStrm.str("");
1576                tmpStrm << "Override Server Settings: " << (cacheDisplayProps>=0?"Enabled":"Disabled");
1577                if (cacheDisplayProps>=0)
1578                {
1579                        tmpStrm << "<br/>";
1580                        tmpStrm << CWebUtil::ChkBoxInput("disableVUICaching",(cacheDisplayProps & AR_CACHE_DPROP_VUI) > 0) << "Disable VUI Display Property Caching<br/>" ;
1581                        tmpStrm << CWebUtil::ChkBoxInput("disableFieldCaching",(cacheDisplayProps & AR_CACHE_DPROP_FIELD) > 0) << "Disable Field Display Property Caching" ;
1582                }
1583
1584                CTableRow rowOC("");
1585                rowOC.AddCell("Display Property Caching");
1586                rowOC.AddCell(tmpStrm.str());
1587                tbl.AddRow(rowOC);
1588
1589                /////////////////////////////////////////////////////////////////////////////////////
1590
1591                ARLong32 disableStatusHistory = 0;
1592                propVal = propIndex->GetAndUseValue(AR_OPROP_CORE_FIELDS_OPTION_MASK);
1593                if (propVal != NULL)
1594                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1595                                disableStatusHistory = propVal->u.intVal;
1596
1597                CTableRow disSH("");
1598                disSH.AddCell("Disable Status History");
1599                disSH.AddCell((disableStatusHistory & AR_CORE_FIELDS_OPTION_DISABLE_STATUS_HISTORY ? "Yes" : "No"));
1600                tbl.AddRow(disSH);
1601
1602#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1603                ARLong32 allowDelete = 0;
1604                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1605                if (propVal != NULL)
1606                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1607                                allowDelete = propVal->u.intVal;
1608
1609                CTableRow row("");
1610                row.AddCell("Allow Delete");
1611                row.AddCell((allowDelete == 1 ? "Yes" : "No"));
1612                tbl.AddRow(row);
1613
1614                /////////////////////////////////////////////////////////////////////////////////////
1615
1616                ARLong32 allowDrillDownWebReports = 0;
1617                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_ALLOW_DELETE);
1618                if (propVal != NULL)
1619                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1620                                allowDrillDownWebReports = propVal->u.intVal;
1621
1622                row.ClearCells();
1623                row.AddCell("Allow Drill Down in Web Reports");
1624                row.AddCell((allowDrillDownWebReports == 1 ? "Yes" : "No"));
1625                tbl.AddRow(row);
1626
1627                /////////////////////////////////////////////////////////////////////////////////////
1628
1629                ARLong32 value = 0;
1630                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_VIEWS);
1631                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1632                {
1633                        value = propVal->u.intVal;
1634                }
1635                else
1636                        value = AR_LOCALIZE_FORM_VIEWS_ALL;     // default, if property isn't present
1637
1638                const char* strState = "Disabled";
1639                if (value == AR_LOCALIZE_FORM_VIEWS_ALL) strState = "All";
1640                if (value == AR_LOCALIZE_FORM_VIEWS_ALIASES) strState = "Only for selection field aliases";
1641
1642                row.ClearCells();
1643                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_VIEWS));
1644                row.AddCell(strState);
1645                tbl.AddRow(row);
1646
1647                /////////////////////////////////////////////////////////////////////////////////////
1648
1649                value = 0;
1650                propVal = propIndex->GetAndUseValue(AR_OPROP_LOCALIZE_FORM_DATA);
1651                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
1652                {
1653                        value = propVal->u.intVal;
1654                }
1655                else
1656                        value = AR_LOCALIZE_FORM_DATA_ALL; // default, if property isn't present
1657
1658                row.ClearCells();
1659                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_LOCALIZE_FORM_DATA));
1660                row.AddCell((value == 1 ? "Yes" : "No"));
1661                tbl.AddRow(row);
1662
1663#if AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1664               
1665                const char* strValue = "";
1666                propVal = propIndex->GetAndUseValue(AR_OPROP_FORM_TAG_NAME);
1667                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
1668                {
1669                        strValue = propVal->u.charVal;
1670                }
1671
1672                row.ClearCells();
1673                row.AddCell(CAREnum::FieldPropertiesLabel(AR_OPROP_FORM_TAG_NAME));
1674                row.AddCell(strValue);
1675                tbl.AddRow(row);
1676
1677#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_800
1678#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_763
1679#endif //AR_CURRENT_API_VERSION >= AR_API_VERSION_710
1680
1681                // now write the table
1682                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Basic" << "</h2>";
1683                strm << "<div>" << tbl << "</div>";
1684        }
1685        catch(exception& e)
1686        {
1687                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1688        }
1689}
1690
1691void CDocSchemaDetails::ShowEntryPointProperties(std::ostream &strm, CARProplistHelper *propIndex)
1692{
1693        ARValueStruct* propVal;
1694
1695        try
1696        {
1697                stringstream tmpStrm;
1698                CTable tbl("entryPoints", "TblNoBorder");
1699                tbl.AddColumn(20, "Description");
1700                tbl.AddColumn(80, "Value");
1701                tbl.DisableHeader();
1702
1703                // entry points
1704                ARLong32 entryPointNewOrder = -1;
1705                ARLong32 entryPointSearchOrder = -1;
1706
1707                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_NEW_ORDER);
1708                if (propVal != NULL) 
1709                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1710                                entryPointNewOrder = propVal->u.intVal;
1711
1712                propVal = propIndex->GetAndUseValue(AR_SMOPROP_ENTRYPOINT_DEFAULT_SEARCH_ORDER);
1713                if (propVal != NULL) 
1714                        if (propVal->dataType == AR_DATA_TYPE_INTEGER)
1715                                entryPointSearchOrder = propVal->u.intVal;
1716
1717
1718                tmpStrm << CWebUtil::ChkBoxInput("" ,(entryPointNewOrder >= 0)) << "Enable Entry Point" << "<br/>";
1719                tmpStrm << "Application List Display Order: "; if (entryPointNewOrder >=0) tmpStrm << entryPointNewOrder; tmpStrm << "<br/>" << "<br/>";
1720
1721                CTableRow row;
1722                row.AddCell("New Mode");
1723                row.AddCell(tmpStrm.str());
1724                tbl.AddRow(row);
1725               
1726                tmpStrm.str("");
1727                tmpStrm << CWebUtil::ChkBoxInput("", (entryPointSearchOrder >= 0)) << "Enable Entry Point" << "<br/>";
1728                tmpStrm << "Application List Display Order: "; if (entryPointSearchOrder >= 0) tmpStrm << entryPointSearchOrder; tmpStrm << endl;
1729
1730                row.ClearCells();
1731                row.AddCell("Search Mode");
1732                row.AddCell(tmpStrm.str());
1733                tbl.AddRow(row);
1734               
1735                // now write the table
1736                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "EntryPoints" << "</h2>";
1737                strm << "<div>" << tbl << "</div>";
1738        }
1739        catch(exception& e)
1740        {
1741                cout << "EXCEPTION enumerating basic properties: " << e.what() << endl;
1742        }
1743}
1744
1745void CDocSchemaDetails::ShowAuditProperties(std::ostream& strm)
1746{
1747        try
1748        {
1749                const ARAuditInfoStruct& audit = this->schema.GetAuditInfo();
1750                CTable tbl("displayPropList", "TblObjectList");
1751                tbl.AddColumn(20, "Description");
1752                tbl.AddColumn(80, "Values");
1753
1754                CTableRow row("");
1755                row.AddCell("Audit Style");
1756                row.AddCell(CAREnum::AuditStyle(audit.style));
1757                tbl.AddRow(row);
1758
1759                row.ClearCells();
1760                row.AddCell("Audit Enabled");
1761                row.AddCell((audit.enable==0?"No":"Yes"));
1762                tbl.AddRow(row);
1763
1764#if AR_CURRENT_API_VERSION > 13 // Version 7.5 and higher
1765                row.ClearCells();
1766                row.AddCell("Audit Only Changed Fields");
1767                row.AddCell(CAREnum::AuditChangedFields(audit.auditMask));
1768                tbl.AddRow(row);
1769#endif
1770
1771                row.ClearCells();
1772                switch (audit.style)
1773                {
1774                        case AR_AUDIT_NONE:
1775                                {
1776                                        if (audit.formName[0] != 0)
1777                                        {
1778                                                row.AddCell("Audited From Form");
1779                                                row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1780                                                tbl.AddRow(row);
1781                                        }
1782                                }
1783                                break;
1784                        case AR_AUDIT_COPY:
1785                                {
1786                                        row.AddCell("Audit Form");
1787                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1788                                        tbl.AddRow(row);
1789                                }
1790                                break;
1791                        case AR_AUDIT_LOG:
1792                                {
1793                                        row.AddCell("Audit Log Form");
1794                                        row.AddCell(this->pInside->LinkToSchema(audit.formName,rootLevel));
1795                                        tbl.AddRow(row);
1796                                }
1797                                break;
1798                }
1799
1800                // audit qualification
1801                stringstream qualStrm; qualStrm.str("");
1802                int pFormId = schema.GetInsideId();
1803
1804                if (audit.query.operation != AR_COND_OP_NONE)
1805                {
1806                        CRefItem refItem(this->schema, REFM_SCHEMA_AUDIT_QUALIFICATION);
1807                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1808                        arQual.CheckQuery(&audit.query, qualStrm);
1809                }
1810                else
1811                {
1812                        qualStrm << EmptyRunIf << endl;
1813                }
1814
1815                row.ClearCells();
1816                row.AddCell("Qualification");
1817                row.AddCell(qualStrm.str());
1818                tbl.AddRow(row);
1819
1820                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Audit Settings" << "</h2>";
1821                strm << "<div>" << tbl << "</div>";
1822        }
1823        catch (...)
1824        {
1825                cerr << "EXCEPTION audit properties" << endl;
1826        }
1827}
1828
1829void CDocSchemaDetails::ShowArchiveProperties(std::ostream& strm)
1830{
1831        try
1832        {
1833                const ARArchiveInfoStruct& archive = this->schema.GetArchiveInfo();
1834                bool archiveToForm = (archive.archiveType & AR_ARCHIVE_FORM)>0;
1835                bool deleteSource = (archive.archiveType & AR_ARCHIVE_DELETE)>0;
1836                bool archiveToFile = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML))>0;
1837                unsigned int fileFormat = (archive.archiveType & (AR_ARCHIVE_FILE_ARX | AR_ARCHIVE_FILE_XML)) << 2;
1838                bool noAttachments = (archive.archiveType & AR_ARCHIVE_NO_ATTACHMENTS)>0;
1839                bool noDiary = (archive.archiveType & AR_ARCHIVE_NO_DIARY)>0;
1840
1841                CTable tbl("displayPropList", "TblObjectList");
1842                tbl.AddColumn(20, "Description");
1843                tbl.AddColumn(80, "Values");
1844
1845                // archive type
1846                stringstream typeStrm; typeStrm.str("");
1847                if (!archiveToForm && !archiveToFile)
1848                {
1849                        typeStrm << "None";
1850                }
1851                else if (archiveToForm || deleteSource)
1852                {
1853                        if (archiveToForm) typeStrm << "Copy to Archive";
1854                        if (deleteSource && archiveToForm) typeStrm << " and ";
1855                        if (deleteSource) typeStrm << "Delete From Source";
1856                }
1857
1858                CTableRow row("");
1859                row.AddCell("Archive Type");
1860                row.AddCell(typeStrm.str());
1861                tbl.AddRow(row);
1862
1863                row.ClearCells();
1864                row.AddCell("Archive State");
1865                row.AddCell((archive.enable==0?"Disabled":"Enabled"));
1866                tbl.AddRow(row);
1867
1868                row.ClearCells();
1869                if (archiveToFile)
1870                {
1871                        // archive to file is not supported by admin/developer tool; but maybe some day...
1872                        row.AddCell("Archive to File");
1873                        row.AddCell(archive.u.dirPath);
1874                        tbl.AddRow(row);
1875                }
1876                else if (archiveToForm)
1877                {
1878                        stringstream tmpStrm; tmpStrm.str("");
1879                        tmpStrm << this->pInside->LinkToSchema(archive.u.formName,rootLevel) << "<br/>" << endl;
1880                        tmpStrm << CWebUtil::ChkBoxInput("noAttachments",noAttachments) << "No Attachments&nbsp;&nbsp;";
1881                        tmpStrm << CWebUtil::ChkBoxInput("noDiary",noDiary) << "No Diary" << endl;
1882
1883                        row.AddCell("Archive to Form");
1884                        row.AddCell(tmpStrm.str());
1885                        tbl.AddRow(row);
1886                }
1887
1888                if (archive.archiveFrom[0] != 0)
1889                {
1890                        row.ClearCells();
1891                        row.AddCell("Archive From Form");
1892                        row.AddCell(this->pInside->LinkToSchema(archive.archiveFrom, rootLevel));
1893                        tbl.AddRow(row);
1894                }
1895
1896                stringstream qualStrm; qualStrm.str("");
1897                int pFormId = this->schema.GetInsideId(); //this->pInside->SchemaGetInsideId(this->schema.GetARName());
1898
1899                if (archive.query.operation != AR_COND_OP_NONE)
1900                {
1901                        CRefItem refItem(this->schema, REFM_SCHEMA_ARCHIVE_QUALIFICATION);
1902                        CARQualification arQual(*this->pInside, refItem, pFormId, rootLevel);
1903                        arQual.CheckQuery(&archive.query, qualStrm);
1904                }
1905                else
1906                {
1907                        qualStrm << EmptyRunIf << endl;
1908                }
1909
1910                row.ClearCells();
1911                row.AddCell("Times");
1912                row.AddCell(CARDayStructHelper::DayStructToHTMLString(archive.archiveTime));
1913                tbl.AddRow(row);
1914
1915                row.ClearCells();
1916                row.AddCell("Qualification");
1917                row.AddCell(qualStrm.str());
1918                tbl.AddRow(row);
1919
1920                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Archive Settings" << "</h2>";
1921                strm << "<div>" << tbl << "</div>";
1922        }
1923        catch (...)
1924        {
1925                cerr << "EXCEPTION archive properties" << endl;
1926        }
1927}
1928
1929void CDocSchemaDetails::WorkflowReferences(std::ostream &strm)
1930{
1931        try
1932        {
1933                CTable tabSet("setFieldReferences", "TblObjectList");
1934                tabSet.AddColumn(50, "Object Name");
1935                tabSet.AddColumn(10, "Enabled");
1936                tabSet.AddColumn(20, "Execute On");
1937                tabSet.AddColumn(20, "Description");
1938
1939                CTable tabPush("pushReferences", "TblObjectList");
1940                tabPush.AddColumn(50, "Object Name");
1941                tabPush.AddColumn(10, "Enabled");
1942                tabPush.AddColumn(20, "Execute On");
1943                tabPush.AddColumn(20, "Description");
1944
1945                CTable delAction("deleteReferences", "TblObjectList");
1946                delAction.AddColumn(50, "Object Name");
1947                delAction.AddColumn(10, "Enabled");
1948                delAction.AddColumn(20, "Execute On");
1949                delAction.AddColumn(20, "Description");
1950
1951                CTable tabService("serviceReferences", "TblObjectList");
1952                tabService.AddColumn(50, "Object Name");
1953                tabService.AddColumn(10, "Enabled");
1954                tabService.AddColumn(20, "Execute On");
1955                tabService.AddColumn(20, "Description");
1956
1957
1958                const CARSchema::ReferenceList &refList = schema.GetReferences();
1959                CARSchema::ReferenceList::const_iterator curIt = refList.begin();
1960                CARSchema::ReferenceList::const_iterator endIt = refList.end();
1961
1962                for (; curIt != endIt; ++curIt)
1963                {
1964                        int messageId = curIt->GetMessageId();
1965                        if (messageId == REFM_SETFIELDS_FORM)
1966                        {
1967                                bool hasEnabledFlag;
1968                                string tmpEnabled = "";
1969                                string tmpCssEnabled = "";
1970
1971                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1972
1973                                if (hasEnabledFlag)
1974                                {
1975                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1976                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1977                                }
1978
1979                                CTableRow row;
1980                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
1981                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
1982                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
1983                                row.AddCell(curIt->GetDescription(rootLevel));
1984                                tabSet.AddRow(row);
1985                        }
1986                        if (messageId == REFM_SERVICE_CALL)
1987                        {
1988                                bool hasEnabledFlag;
1989                                string tmpEnabled = "";
1990                                string tmpCssEnabled = "";
1991
1992                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
1993
1994                                if (hasEnabledFlag)
1995                                {
1996                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
1997                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
1998                                }
1999
2000                                CTableRow row;
2001                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2002                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2003                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2004                                row.AddCell(curIt->GetDescription(rootLevel));
2005                                tabService.AddRow(row);
2006                        }
2007                        if (messageId == REFM_PUSHFIELD_TARGET)
2008                        {
2009                                bool hasEnabledFlag;
2010                                string tmpEnabled = "";
2011                                string tmpCssEnabled = "";
2012
2013                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2014
2015                                if (hasEnabledFlag)
2016                                {
2017                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2018                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2019                                }
2020
2021                                CTableRow row;
2022                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2023                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2024                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2025                                row.AddCell(curIt->GetDescription(rootLevel));
2026                                tabPush.AddRow(row);
2027                        }
2028                        if (messageId == REFM_DELETE_ENTRY_ACTION)
2029                        {
2030                                bool hasEnabledFlag;
2031                                string tmpEnabled = "";
2032                                string tmpCssEnabled = "";
2033
2034                                unsigned int enabled = curIt->GetObjectEnabled(hasEnabledFlag);
2035
2036                                if (hasEnabledFlag)
2037                                {
2038                                        tmpEnabled = CAREnum::ObjectEnable(enabled);
2039                                        if (!enabled) { tmpCssEnabled = "objStatusDisabled"; }
2040                                }
2041
2042                                CTableRow row;
2043                                row.AddCell(WorkflowReferenceTable::LinkToObjByRefItem(*curIt, rootLevel));
2044                                row.AddCell(CTableCell(tmpEnabled, tmpCssEnabled)); // Enabled?
2045                                row.AddCell(curIt->GetObjectExecuteOn()); // Exceute On
2046                                row.AddCell(curIt->GetDescription(rootLevel));
2047                                delAction.AddRow(row);
2048                        }
2049                }
2050
2051                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow reading data from this form" << endl;
2052                tabSet.ToXHtml(strm);
2053
2054                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow writing data to this form" << endl;
2055                tabPush.ToXHtml(strm);
2056
2057                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow deleting data on this form" << endl;
2058                delAction.ToXHtml(strm);
2059
2060                strm << ImageTag(ImageTag::Document, rootLevel) << "Workflow executing services on this form" << endl;
2061                tabService.ToXHtml(strm);
2062        }
2063        catch(exception& e)
2064        {
2065                cout << "EXCEPTION enumerating filter push fields references in schema '" << this->schema.GetName() << "': " << e.what() << endl;
2066        }
2067}
2068
2069string CDocSchemaDetails::GenerateReferencesTable(const ARCompoundSchema &compSchema)
2070{
2071        stringstream strmTmp;
2072        WorkflowReferences(strmTmp);
2073
2074        //Schema Properties
2075        CTable tblObjProp("objProperties", "TblObjectList");
2076        tblObjProp.AddColumn(0, "Property");
2077        tblObjProp.AddColumn(0, "Value");
2078
2079        //Schema type informations
2080        CTableRow row("cssStdRow");     
2081        CTableCell cellProp("");                               
2082        CTableCell cellPropValue("");   
2083
2084        //Container References
2085        row.ClearCells();
2086        cellProp.content = "Container References";
2087        cellPropValue.content = this->ContainerReferences();
2088        row.AddCell(cellProp);
2089        row.AddCell(cellPropValue);
2090        tblObjProp.AddRow(row);                 
2091
2092        //TableField References
2093        row.ClearCells();
2094        cellProp.content = "Table Fields datasource form";
2095        cellPropValue.content = this->TableFieldReferences();
2096        row.AddCell(cellProp);
2097        row.AddCell(cellPropValue);
2098        tblObjProp.AddRow(row); 
2099
2100        //AL window open references
2101        row.ClearCells();
2102        cellProp.content = "Active Link \"Open Window Action\"";
2103        cellPropValue.content = this->AlWindowOpenReferences();
2104        row.AddCell(cellProp);
2105        row.AddCell(cellPropValue);
2106        tblObjProp.AddRow(row);
2107
2108        //Join References
2109        row.ClearCells();
2110        cellProp.content = "Join Form References";
2111        cellPropValue.content = this->JoinFormReferences();
2112        row.AddCell(cellProp);
2113        row.AddCell(cellPropValue);
2114        tblObjProp.AddRow(row);
2115
2116        //Menu References
2117        row.ClearCells();
2118        cellProp.content = "Search Menu References";
2119        cellPropValue.content = this->SearchMenuReferences();
2120        row.AddCell(cellProp);
2121        row.AddCell(cellPropValue);
2122        tblObjProp.AddRow(row);
2123
2124        strmTmp << tblObjProp;
2125        return strmTmp.str();
2126}
2127
2128bool CDocSchemaDetails::IsJoinViewOrVendorForm()
2129{
2130        switch(this->schema.GetCompound().schemaType)
2131        {
2132        case AR_SCHEMA_JOIN:
2133        case AR_SCHEMA_VIEW:
2134        case AR_SCHEMA_VENDOR:
2135                return true;
2136        default:       
2137                return false;
2138        }
2139}
2140
2141string CDocSchemaDetails::ShowGeneralInfo()
2142{
2143        const ARCompoundSchema &compSchema = this->schema.GetCompound();
2144        stringstream strm;
2145
2146        CTable tbl("general", "TblNoBorder");
2147        tbl.AddColumn(20, "");
2148        tbl.AddColumn(80, "");
2149        tbl.DisableHeader();
2150
2151        CTableRow row;
2152        row.AddCell("Name");
2153        row.AddCell(this->schema.GetName());
2154        tbl.AddRow(row);       
2155        row.ClearCells();
2156
2157        // generate the schema type row (and with additional details for special form types like join, view and vendor)
2158        if (compSchema.schemaType == AR_SCHEMA_JOIN)
2159        {
2160                strm << CAREnum::JoinType(compSchema.u.join.option) << "-";
2161        }
2162        strm << CAREnum::SchemaType(compSchema.schemaType);
2163
2164        if(compSchema.schemaType == AR_SCHEMA_JOIN
2165                || compSchema.schemaType == AR_SCHEMA_VIEW
2166                || compSchema.schemaType == AR_SCHEMA_VENDOR)
2167        {
2168                strm << " " << this->TypeDetails();
2169        }
2170
2171        row.AddCell("Type");
2172        row.AddCell(strm.str());
2173        tbl.AddRow(row);
2174        row.ClearCells();
2175        strm.str("");
2176
2177        // search for the default vui
2178        CARVui defaultVUI(this->schema.GetInsideId(), this->schema.GetDefaultVUI());
2179
2180        row.AddCell("Default View");
2181        row.AddCell(CheckedURLLink(defaultVUI, schema.GetDefaultVUI(), rootLevel));
2182        tbl.AddRow(row);
2183        row.ClearCells();
2184
2185        strm << tbl.ToXHtml();
2186        tbl.ClearRows();
2187
2188        if (pInside->CompareServerVersion(7,1) >= 0)
2189        {
2190                stringstream numberConverter;
2191                if (schema.GetDbTableId() > 0)
2192                        numberConverter << schema.GetDbTableId();
2193
2194                row.AddCell("DB Table ID");
2195                row.AddCell(numberConverter.str());
2196                tbl.AddRow(row);
2197                row.ClearCells();
2198
2199                if (compSchema.schemaType != AR_SCHEMA_DIALOG && compSchema.schemaType != AR_SCHEMA_VENDOR)
2200                {
2201                        row.AddCell("DB Table View");
2202                        row.AddCell(schema.GetDbViewName());
2203                        tbl.AddRow(row);
2204                        row.ClearCells();
2205
2206                        row.AddCell("DB Table SH Views");
2207                        row.AddCell(schema.GetDbShViewName());
2208                        tbl.AddRow(row);
2209                        row.ClearCells();
2210                }
2211
2212                strm << tbl.ToXHtml();
2213        }
2214
2215        strm << "<hr/>" << endl;
2216
2217        strm << ShowProperties();
2218
2219        strm << "<hr/>" << endl;
2220
2221        return strm.str();
2222}
2223
2224void CDocSchemaDetails::ShowFTSMTSProperties(std::ostream& strm, CARProplistHelper *propIndex)
2225{
2226#if AR_CURRENT_API_VERSION >= AR_API_VERSION_763
2227        if (pInside->CompareServerVersion(7,6,3) < 0)
2228                return;
2229
2230        ARValueStruct* propVal;
2231        int iValue;
2232
2233        try
2234        {
2235                stringstream tmpStrm;
2236                CTable tbl("ftsProps", "TblNoBorder");
2237                tbl.AddColumn(20, "Description");
2238                tbl.AddColumn(80, "Value");
2239                tbl.DisableHeader();
2240
2241                ///////////////////////////////////////////////////////////////////////////////////////
2242
2243                CTableRow       row("");
2244                iValue = 0;
2245                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_OPTION_MASK);
2246                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2247                        iValue = propVal->u.intVal;
2248               
2249                row.AddCell("Exclude from multi-form search");
2250                row.AddCell((iValue & AR_MULTI_FORM_SEARCH_OPTION_EXCLUDE ? "Yes" : "No"));             
2251                tbl.AddRow(row);
2252
2253                ///////////////////////////////////////////////////////////////////////////////////////
2254
2255                row.ClearCells();
2256                char* strValue = NULL;
2257                vector<int> weightedRelevancyFields; weightedRelevancyFields.resize(4);
2258
2259                propVal = propIndex->GetAndUseValue(AR_OPROP_MFS_WEIGHTED_RELEVANCY_FIELDS);
2260                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_CHAR)
2261                        strValue = propVal->u.charVal;
2262
2263
2264                if (strValue != NULL && strValue[0] != 0)
2265                {
2266                        int numFields = atoi(strValue);
2267                        char* newPos = strchr(strValue, ';');
2268                        if (newPos)
2269                        {
2270                                strValue = newPos + 1;
2271                                for (int fieldPos = 0; fieldPos < numFields; fieldPos++)
2272                                {
2273                                        int fieldTag = atoi(strValue);
2274                                       
2275                                        newPos = strchr(strValue, ';');
2276                                        if (newPos)
2277                                        {
2278                                                strValue = newPos + 1;
2279                                                int fieldId = atoi(strValue);
2280                                               
2281                                                if (fieldTag > 0 && fieldTag <= AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG)
2282                                                {
2283                                                        weightedRelevancyFields[fieldTag-1] = fieldId;
2284                                                }
2285                                        }
2286                                }
2287                        }
2288                }
2289
2290                CTable weightedRelFields("WRFields", "TblNoBorder");
2291                weightedRelFields.AddColumn(0, "");
2292                weightedRelFields.AddColumn(80, "");
2293                weightedRelFields.DisableHeader();
2294
2295                for (unsigned int wrfPos = 0; wrfPos < AR_MFS_WEIGHTED_RELEVANCY_KEYWORDS_FIELD_TAG; wrfPos++)
2296                {
2297                        int fieldId = weightedRelevancyFields[wrfPos];
2298
2299                        CTableRow wrfRow("");
2300                        wrfRow.AddCell(CAREnum::WeightedRelevancyFieldType(wrfPos+1));
2301                        wrfRow.AddCell((fieldId > 0 ? pInside->LinkToField(this->schema.GetInsideId(), fieldId, rootLevel) : ""));
2302                        weightedRelFields.AddRow(wrfRow);
2303
2304                        if (fieldId > 0 && (!pInside->appConfig.bOverlaySupport || IsVisibleObject(schema)))
2305                        {
2306                                CRefItem ref(schema, REFM_SCHEMA_FTS_WEIGHTED_RELEVANCY_FIELD);
2307                                pInside->AddFieldReference(schema.GetInsideId(), fieldId, ref);
2308                        }
2309                }
2310
2311                row.AddCell("Weighted relevancy fields");
2312                row.AddCell(weightedRelFields.ToXHtml());
2313                tbl.AddRow(row);
2314
2315                ///////////////////////////////////////////////////////////////////////////////////////
2316
2317                row.ClearCells();
2318                ARDayStruct timeValue;
2319                unsigned int intervalValue = 0;
2320
2321                ARZeroMemory(&timeValue);
2322
2323                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MONTH_MASK);
2324                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2325                        timeValue.monthday = propVal->u.intVal;
2326
2327                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_WEEKDAY_MASK);
2328                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2329                        timeValue.weekday = propVal->u.intVal;
2330
2331                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_HOUR_MASK);
2332                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2333                        timeValue.hourmask = propVal->u.intVal;
2334               
2335                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_MINUTE);
2336                if (propVal != NULL && propVal->dataType == AR_DATA_TYPE_INTEGER)
2337                        timeValue.minute = propVal->u.intVal;
2338
2339                propVal = propIndex->GetAndUseValue(AR_OPROP_FT_SCAN_TIME_INTERVAL);
2340                if (propVal != NULL && (propVal->dataType == AR_DATA_TYPE_INTEGER || propVal->dataType == AR_DATA_TYPE_ULONG))
2341                        intervalValue = propVal->u.ulongVal;
2342               
2343                row.AddCell("FT-indexed field updates");
2344                if (timeValue.monthday != 0 || timeValue.weekday != 0 || timeValue.hourmask != 0 || timeValue.minute != 0)
2345                {
2346                        row.AddCell(CARDayStructHelper::DayStructToHTMLString(timeValue));
2347                }
2348                else if (intervalValue != 0)
2349                {
2350                        unsigned int days, hours, minutes, seconds;
2351                        CARDayStructHelper::SplitInterval(intervalValue, days, hours, minutes, seconds);
2352
2353                        tmpStrm.str("");
2354                        tmpStrm << days << " Days " << hours << " Hours " << minutes << " Minutes";
2355                        row.AddCell(tmpStrm.str());
2356                }
2357                else
2358                {
2359                        row.AddCell("No Time specified");
2360                }
2361                tbl.AddRow(row);
2362
2363                ///////////////////////////////////////////////////////////////////////////////////////
2364
2365                strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Full Text Search" << "</h2>";
2366                strm << "<div>" << tbl << "</div>";
2367        }
2368        catch (exception &e)
2369        {
2370                cerr << "EXCEPTION in ShowFTSMTSProperties: " << e.what() << endl;
2371        }
2372#endif
2373}
2374
2375void CDocSchemaDetails::ShowChangeHistory(std::ostream &strm, CARProplistHelper *propIndex)
2376{
2377        strm << "<h2>" << ImageTag(ImageTag::Document, rootLevel) << "Change History &amp; Helptext" << "</h2>"
2378             << "<div>" << this->pInside->ServerObjectHistory(&this->schema, rootLevel, true) << "</div>" << endl;
2379}
Note: See TracBrowser for help on using the repository browser.