# # Grouper UI configuration # $Id: grouper.client.example.properties,v 1.24 2009-12-30 04:23:02 mchyzer Exp $ # ######################################## ## Config chaining hierarchy ## The grouper UI properties uses Grouper Configuration Overlays (documented on wiki) ## By default the configuration is read from grouper-ui.base.properties ## (which should not be edited), and the grouper-ui.properties overlays ## the base settings. See the grouper-ui.base.properties for the possible ## settings that can be applied to the grouper-ui.properties ######################################## # comma separated config files that override each other (files on the right override the left) # each should start with file: or classpath: # e.g. classpath:grouper-ui.example.properties, file:c:/something/myconfig.properties # {valueType: "string", required: true, multiple: true} grouperUi.config.hierarchy = classpath:grouper-ui-ng.base.properties, classpath:grouper-ui.properties, database:grouper # seconds between checking to see if the config files are updated # {valueType: "integer"} grouperUi.config.secondsBetweenUpdateChecks = 600 ########################################### ## Text bundles for UI ########################################### # the default index # {valueType: "integer"} grouper.text.defaultBundleIndex = 0 # language for this bundle # {valueType: "string", regex: "^grouper.text.bundle.([0-9]+).language$"} grouper.text.bundle.0.language = en # country for this bundle # {valueType: "string", regex: "^grouper.text.bundle.([0-9]+).country$"} grouper.text.bundle.0.country = us # filename in the package grouperText that is before the .base.properties, and .properties # {valueType: "string", regex: "^grouper.text.bundle.([0-9]+).fileNamePrefix$"} grouper.text.bundle.0.fileNamePrefix = grouperText/grouper.text.en.us ######################################## ## Simple Look and feel. ## How to change logos and CSS ######################################## # You may specify a logo for your organisation and for Grouper. Off-the-shelf # your organisation logo appears on the left of the header and the Grouper logo # appears on the right. Typically you would make the logos the same height. # {valueType: "string"} image.organisation-logo=grouperExternal/public/assets/images/organisation-logo.gif # grouper logo # ${valueType: "string"} image.grouper-logo=grouperExternal/public/assets/images/grouper.gif # A space separated list of one or more .css files which are inserted into the # HEAD of all Grouper pages. The .css files are referenced in order and after # any Grouper CSS files. This means that your CSS files can override any # Grouper style definition # {valueType: "string", multiple: true} css.additional= ######################################## #### Miscellaneous UI configuration ######################################## # Decide if the browser folder/group pane should auto-select # the currently selected object in the view. This will expand the # folder menu for every item navigated, so may have performance issues. # If turned off, refresh can still be forced by the Browse Folders refresh icon # Note for Grouper 2.3.0 this should remain false until it is more stable. # {valueType: "boolean", required: false} uiV2.refresh.menu.on.view=false # Specifies whether Grouper should display a logout link. Not all authentication # schemes allow logout, including Basic authentication. # This value can be set in the Grouper UI build.properties file # Note that Grouper cannot guarantee that #ending the session will log the user out of your authentication system!!! #Only set to true if you can genuinely logout. # {valueType: "boolean", required: false} logout.link.show=true # Specifies the maximum length for the subject String that appears in the subheader # welcome message # {valueType: "integer", required: true} welcome.subject.max-length=80 #Set this to 'all' to remove all cookies, or set to a comma or space separated list of #cookie names to delete. Java code will do a Cookie.getName().equals or .matches #so valid regular expressions may be used # ${valueType: "string", multiple: true} logout.cookies-to-delete=none # If logout should redirect to an external URL, put that URL here # ${valueType: "string"} grouperUi.logout.redirectToUrl.elConfig = ${elUtils.processEnvVarOrFile('GROUPERUI_LOGOUT_REDIRECTTOURL')} # When creating a group, which access privs will be granted to GrouperAll? # groups.create.grant.all allows the UI to override the defaults in grouper.properties # =none if none should be checked in the UI # If not set, the defaults from the grouper.properties file will be used # NB in the QuickStart, no privs are automatically assigned - grouper.properties was # modified so that all 'groups.create.grant.all.' are false, # ${valueType: "string"} groups.create.grant.all= # Unless otherwise configured, the UI starts browsing at the ROOTstem. set default.browse.stem # to start browsing from a different stem. You can override the default browse stem, # however, you must ensure that the stem exists by creating it using the Grouper API # ${valueType: "stem"} default.browse.stem= # If the default folder menu is set to a non-root folder via property default.browse.stem, # set default.browse.stem.uiv2.menu to false to disable it specifically in the V2 UI but # leave it enabled in the Admin and Lite UI # {valueType: "boolean", required: false} default.browse.stem.uiv2.menu=true # Turn off the debug functionality (true/false) # For production turn off (false) or restrict to a group # {valueType: "boolean", required: true} browser.debug.enable=false # If debug is on then restrict to named group. Disable if group does not exist # ${valueType: "group"} browser.debug.group= # Enables user to specify arbitrary exsecutable as HTML editor on the server # Do not enable unless you absolutely trust users # {valueType: "boolean", required: true} browser.debug.group.enable-html-editor=false #If you want to save your debug preferences, set debug.prefs.dir to an existing directory #on you system, where the user Tomcat runs as, has write privilege # ${valueType: "string"} debug.prefs.dir=someDir/someWhereMustExist # Format string for created/edited dates for Grouper objects (groups, stems, subjects, etc). # Default example is e.g. "Fri Oct 23 1:43:35 PM EDT 2020" (see Java SimpleDateFormat for valid formats) # {valueType: "string", required: false} uiV2.grouperObjects.dateFormat = EE MMM d h:mm:ss aa zz yyyy ##################################################### ## Membership Import and export ## As of V1.2 the UI provides a framework for allowing users to export membership lists ## to flat files i.e. comma separated files, including in Excel compatible format. It is also ## possible to import simple delimited files. ## Both import and export require configuration and appropriate configuration will vary from ## site to site. For this reason, the UI does not come pre-configued for import/export, however, ## sample files are provided (see [Enabling import / export of group memberships|Customising the Grouper UI#import-export]) ##################################################### # membership export legacy config # ${valueType: "string"} #membership-export.config=resources/grouper/membership-export.xml # membership import legacy config # ${valueType: "string"} #membership-import.config=resources/grouper/membership-import.xml #for large files, give a temp dir so they arent stored in memory or the system temp dir # ${valueType: "string"} file.upload.temp.dir= # legacy max bytes # ${valueType: "integer"} file.upload.max.bytes= #note: if they are in the this group, then they can use the lite ui too # ${valueType: "group"} require.group.for.logins= #users must be in this group to be able to login to the lite membership update UI (if not in require.group.for.logins) # ${valueType: "group"} require.group.for.membershipUpdateLite.logins= #users must be in this group to be able to login to the subjectPicker UI (if not in require.group.for.logins or require.group.for.membershipUpdateLite.logins) # ${valueType: "group"} require.group.for.subjectPicker.logins= #users must be in this group to invite external users to grouper # ${valueType: "group"} require.group.for.inviteExternalSubjects.logins= #users must be in this group to assign/create/etc attributes in the UI (new attribute framework) (if not in require.group.for.logins) # ${valueType: "group"} require.group.for.attributeUpdateLite.logins= # if true, when a user logs in, a folder will be created and granted to the user if not already there # {valueType: "boolean", required: true} grouperUi.autoCreateUserFolderOnLogin=false # you can set a folder for the user. If the folder is not created then privileges will not be adjusted # you can use EL here based on the subject, e.g. users:folders:${subject.id} or users:folders:${subject.getAttributeValue('netId')} # ${valueType: "string"} grouperUi.autoCreateUserFolderName= # if the folders are leaves in the tree, this can be false, if you need to create parents, set to true (be careful) # {valueType: "boolean", required: true} grouperUi.autoCreateUserFolderCreateParentFoldersIfNotExist = false ########################################### ## Displaying lists ########################################### # When browsing or searching the UI will present lists of various objects. The following settings # allow sites to control default page sizes and a list of user-selectable page sizes # {valueType: "integer", required: true} pager.pagesize.default=50 # {valueType: "string", required: true} pager.pagesize.selection=10 25 50 100 # If we should remove paging from subject search since we cant *really* page through all subjects, # you would just be paging through the first part of the first page. IF you set this to true # then you might want to bump up the default pagesize... # {valueType: "boolean", required: true} pager.removeFromSubjectSearch=false # Typically, when browsing it is sufficient to show the extension/displayExtension for a group/stem # as the parent stems are aleady shown and are common. When searching, however, this context is lost # so sites can configure which field to display in the context of a search where results may come from # different locations # ${valueType: "string"} search.group.result-field=displayName # legacy stem field # ${valueType: "string"} search.stem.result-field=displayName # By setting the 'result-field-choice' properties, sites can alow users to select which # field to use for displaying serach resuts # ${valueType: "string"} search.group.result-field-choice=displayName displayExtension name # result field choice # ${valueType: "string"} search.stem.result-field-choice=displayName displayExtension name # Provides backwards compatability - it was assumed that all Subjects woud have a 'description' attribute # {valueType: "string", regex: "^subject\\.display\\.([^=]+)$"} subject.display.default=description # Used for groups when displayed as a subject i.e. when displayed as member of another group # {valueType: "string", regex: "^subject\\.display\\.([^=]+)$"} subject.display.g\:gsa=displayExtension # Used for groups when displayed as a subject i.e. when displayed as member of another group # {valueType: "string", regex: "^subject\\.display\\.([^=]+)$"} subject.display.grouperEntities=displayExtension # Used for internal Grouper subjects i.e. GrouperAll and GrouperSystem # ${valueType: "string"} # {valueType: "string", regex: "^subject\\.display\\.([^=]+)$"} subject.display.g\:isa=name # Default attribute to display for groups # ${valueType: "string"} group.display=displayExtension # Attribute to use when browsing and the user has selected to hide the hierarchy - # thus losing context # ${valueType: "string"} group.display.flat=displayName # Default attribute for stems # ${valueType: "string"} stem.display=displayExtension ###################################### ## Searching ## Configuration affecting how simple default group/stem searches are carried out ###################################### # Determines if the name or extension field (or neither) are searched # ${valueType: "string"} search.default.search-in-name-or-extension= # Determines if the display name or display extension (or neither) is searched # ${valueType: "string"} search.default.search-in-display-name-or-extension=name # On the advanced groups search screen determines how many search fields are displayed # {valueType: "integer", required: true} search.max-fields=5 # On the advanced groups search screen determines how many group type select lists are displayed # {valueType: "integer", required: true} search.max-group-types=3 # On the advanced stems search screen determines how many search fields are displayed # {valueType: "integer", required: true} search.stems.max-fields=4 # Control whether default search can search any attribute. Valid values=only or true or false # {valueType: "boolean", required: true} search.default.any=false # Control default search option # ${valueType: "string"} search.default=name # dojo autocompletion for add member/add groups does a wildcard search # for every character typed. If defined, only allow this for certain # forms. If undefined, allow for all of them # ${valueType: "string", multiple: true} #uiV2.search.autocompleteById.allowedPaths = /UiV2Subject.addToGroupFilter, /UiV2Stem.createGroupParentFolderFilter, /UiV2Group.addMemberFilter # autocomplete search restrict # ${valueType: "string", multiple: true} #uiV2.search.autocompleteSearch.allowedPaths = /UiV2Subject.addToGroupFilter, /UiV2Stem.createGroupParentFolderFilter, /UiV2Group.addMemberFilter # Allow filtering of membership lists by subject source # {valueType: "boolean", required: true} members.filter.by-source=true # filter limit # {valueType: "integer", required: true} members.filter.limit=500 # Displays source specific form elements using keys: # subject.search.form-fragment. # ${valueType: "string", multiple: true} subject.search.form-fragment.g\:gsa=subjectSearchGroupFragmentDef ################################################# ## Sorting ################################################# # As of V1.2 the Grouper UI allows sorting of various lists of objects # See [Sort order of lists|Customising the Grouper UI#sort] for explanation # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.impl=edu.internet2.middleware.grouper.ui.DefaultComparatorImpl # sort groups # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.Group=edu.internet2.middleware.grouper.ui.GroupComparatorHelper # sort group as map # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.ui.util.GroupAsMap=edu.internet2.middleware.grouper.ui.GroupComparatorHelper # sort stems # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.Stem=edu.internet2.middleware.grouper.ui.StemComparatorHelper # sort stem as map # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.ui.util.StemAsMap=edu.internet2.middleware.grouper.ui.StemComparatorHelper # sort subject # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.subject.Subject=edu.internet2.middleware.grouper.ui.SubjectComparatorHelper # sort subject as map # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.ui.util.SubjectAsMap=edu.internet2.middleware.grouper.ui.SubjectComparatorHelper # sort member # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.Member=edu.internet2.middleware.grouper.ui.SubjectComparatorHelper # sort membership # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.Membership=edu.internet2.middleware.grouper.ui.SubjectComparatorHelper # sort membership as map # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.ui.util.MembershipAsMap=edu.internet2.middleware.grouper.ui.SubjectComparatorHelper # sort subject privilege as map # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.ui.util.SubjectPrivilegeAsMap=edu.internet2.middleware.grouper.ui.GroupOrStemComparatorHelper # sort composite # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.Composite=edu.internet2.middleware.grouper.ui.ComositeComparatorHelper # sort composite as map # ${valueType: "class", mustImplementInterface: "edu.internet2.middleware.grouper.ui.GrouperComparatorHelper"} comparator.helper.edu.internet2.middleware.grouper.ui.util.CompositeAsMap=edu.internet2.middleware.grouper.ui.CompositeComparatorHelper # Sorting large lists can be computationally expensive - and slow. Use this property to turn off sorting for # large lists # {valueType: "integer", required: true} comparator.sort.limit=200 # SubjectSummary page lists full names - so sort on those by default # {valueType: "string"} group.sort.subjectSummary=displayName # stem sort subject summary # {valueType: "string"} stem.sort.subjectSumamry=displayName # To control the order in which subject attributes are listed on the Subject Summary page: # subject.attributes.order.=comma separated list of case sensitive attribute names # {valueType: "string", multiple: true, regex: "^subject\\.attributes\\.order\\.([^=]+)$"} subject.attributes.order.g\:gsa=displayExtension,displayName,name,alternateName,extension,createTime,createSubjectId,createSubjectType,modifySubjectId,modifySubjectType,modifyTime,subjectType,id # To control the order in which subject attributes are listed in the New UI without expanding the attribute list. # {valueType: "string", multiple: true} subject2.attributes.order.nonexpanded.default=subjectId,email,name,description # Override for each source # {valueType: "string", multiple: true, regex: "^subject\\.attributes\\.order\\.nonexpanded\\.([^=]+)$"} subject2.attributes.order.nonexpanded.g\:isa=subjectId,name,description # To control the order in which subject attributes are listed in the New UI in the expanded results # Leave empty to display all subject attributes (excluding name, description, email and subject id) # {valueType: "string", multiple: true, regex: "^subject\\.attributes\\.order\\.expanded\\.([^=]+)$"} #subject2.attributes.order.expanded.default=lfname,loginid,memberId,sourceId,sourceName # Override for each source # {valueType: "string", multiple: true, regex: "^subject\\.attributes\\.order\\.expanded\\.([^=]+)$"} # subject2.attributes.order.expanded.jdbc=lfname,loginid ############################################### ## Member sorting and searching ############################################### # Whether to enable member sorting using sort attributes stored in Grouper. # {valueType: "boolean", required: true} member.sort.enabled=true # Whether to use default sorting only and not allow users to specify which sort attribute to use. # {valueType: "boolean", required: true} member.sort.defaultOnly=false # Whether to enable member searching using search attributes stored in Grouper. # {valueType: "boolean", required: true} member.search.enabled=true ################################################### ## Audit query ################################################### # Date format likely to be locale dependent + may need to turn on/off # {valueType: "boolean", required: true} audit.query.enabled=true #SimpleDateFormat format strings (v1.x legacy UI) # {valueType: "string"} audit.query.date-format=MM/dd/yyyy # display date format (v1.x legacy UI) # {valueType: "string"} audit.query.display-date-format=dd MMM yyyy HH:mm:ss # If no date specified show results for audit.query.default-since days (v1.x legacy UI) # {valueType: "integer", required: true} audit.query.default-since=7 # Format string for audit dates # Default example is e.g. "2020/10/24 12:43 AM" (see Java SimpleDateFormat for valid formats) # {valueType: "string", required: false} uiV2.audit.dateFormat = yyyy/MM/dd h:mm aa ##################################################### ## Misc ##################################################### # give more info about what is not serializable in the session # {valueType: "boolean", required: true} debugSessionSerialization = false # Infodots #if the little yellow "i" images that show help should be enabled # {valueType: "boolean", required: true} infodot.enable=true ############################# ## Subject settings ############################# # {valueType: "integer", required: true} subject.maxChars = 100 # v2 max chars on subject before abbreviated # {valueType: "integer", required: true} subject2.maxChars = 40 ############################# ## Security settings ############################# # if you want to have the username in http header, put the head name here, e.g. REMOTE_USER # {valueType: "string"} grouper.ui.authentication.http.header = # comma separated source ids that the authenticating user must be in to authenticate (if blank accept all) # {valueType: "string", multiple: true} grouper.ui.authentication.sourceIds = # if the user id on each UI request must match (e.g. with shib) # {valueType: "boolean", required: true} grouper.ui.authentication.allowUserIdSwitching = false ############################# ## Membership settings ############################# # Lite UI settings #can be subjectId, sourceId, name, description, screenLabel, memberId, or attribute name which is single valued #comma separated. will be sorted by sourceId, then the sort field (recommended to be screenName) # {valueType: "string", multiple: true} simpleMembershipUpdate.exportAllSubjectFields=sourceId, screenLabel, entityId, name, description # export sort field # {valueType: "string"} simpleMembershipUpdate.exportAllSortField=screenLabel # combo result size # {valueType: "integer", required: true} simpleMembershipUpdate.groupComboboxResultSize=200 # filter combo min chars # {valueType: "integer", required: true} simpleMembershipUpdate.filterComboMinChars=3 # filter max search subjects # {valueType: "integer", required: true} simpleMembershipUpdate.filterMaxSearchSubjects=1000 # max subjects in drop down # {valueType: "integer", required: true} simpleMembershipUpdate.subjectComboboxResultSize=250 #add an extra css to the simple membership update. use relative or absolute urls, comma separated # {valueType: "string", multiple: true} simpleMembershipUpdate.extraCss = #properties file via url to look for text first (before nav.properties) # {valueType: "string"} simpleMembershipUpdate.textFromUrl = #directory for skin files, if putting config files on file system and not classpath, then put the files here # {valueType: "string"} simpleMembershipUpdate.confDir = #if by default the screen will delete multiple #(screen is easier to use but takes longer potentially and defaults to false) # {valueType: "boolean", required: true} simpleMembershipUpdate.defaultDeleteMultiple=false #if by default the screen will show the import by file instead of direct textarea input #this defaults to true which helps with large imports, there might be memory problem with textarea import # {valueType: "boolean", required: true} simpleMembershipUpdate.defaultImportFile=true #if we should allow external URL properties in group attribute: grouperGroupMshipSettingsUrl # {valueType: "boolean", required: true} simpleMembershipUpdate.allowExternalUrlProperties=true #if allowing external text by url, this is the filter to strip invalid html tags. blank for none # {valueType: "class", mustExtendClass: "edu.internet2.middleware.grouper.util.GrouperHtmlFilter"} simpleMembershipUpdate.externalUrlTextProperties.grouperHtmlFilter = edu.internet2.middleware.grouper.util.GrouperHtmlFilter #if the breadcrumb row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showBreadcrumbRowByDefault=true #if the name row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showNameRowByDefault=true #if the path row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showPathRowByDefault=true #if the description row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showDescriptionRowByDefault=true #if the id row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showIdRowByDefault=false #if the id path row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showIdPathRowByDefault=false #if the alternate id path row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showAlternateIdPathRowByDefault=false #if the uuid row should show on the screen by default # {valueType: "boolean", required: true} simpleMembershipUpdate.showUuidRowByDefault=false #if results must be in a certain group, or blank for no check. e.g. must be in employee group # ${valueType: "group"} simpleMembershipUpdate.subjectSearchRequireGroup = #if results must be in certain sources, or blank for no check. e.g. must be in the person sources, comma separated # ${valueType: "string", multiple: true} simpleMembershipUpdate.subjectSearchRequireSources = # customizer class to customize common things (extend GrouperUiCustomizer) # ${valueType: "class", mustExtendClass: "org.apache.commons.lang.StringUtils.GrouperUiCustomizer"} grouperUiCustomizerClassname = # kill all cookies with these prefixes on logout (comma separated) # ${valueType: "string", multiple: true} grouperUi.logout.cookie.prefix = # this configures how subjects look in the UI v2.2. This is the short version of the subject # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.sourceId\\.([0-9]+)$"} grouperUi.screenLabel2.sourceId.0 = jdbc # el for display of subjects # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.screenEl\\.([0-9]+)$"} grouperUi.screenLabel2.screenEl.0 = ${subject.name} # this configures how subjects look in the UI v2.2. This is the short version of the subject # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.sourceId\\.([0-9]+)$"} grouperUi.screenLabel2.sourceId.1 = g:gsa # el for display of subjects # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.screenEl\\.([0-9]+)$"} grouperUi.screenLabel2.screenEl.1 = ${subject.getAttributeValue('displayExtension')} # this configures how subjects look in the UI v2.2. This is the short version of the subject # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.sourceId\\.([0-9]+)$"} grouperUi.screenLabel2.sourceId.2 = g:rsa # el for display of subjects # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.screenEl\\.([0-9]+)$"} grouperUi.screenLabel2.screenEl.2 = ${subject.getAttributeValue('displayExtension')} # this configures how subjects look in the UI v2.2. This is the short version of the subject # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.sourceId\\.([0-9]+)$"} grouperUi.screenLabel2.sourceId.3 = grouperEntities # el for display of subjects # ${valueType: "string", regex: "^grouperUi\\.screenLabel2\\.screenEl\\.([0-9]+)$"} grouperUi.screenLabel2.screenEl.3 = ${subject.getAttributeValue('displayExtension')} # Custom subject icons for V2 new UI - optionally set a different icon based on the subject id # # Override the default user icon for a specific source ID. Subjects can continue # to be defined until a break in the numeric sequence of the sourceId value # # Note: Changes to g:gsa, g:isa, and grouperEntities are currently ineffective # ${valueType: "string" grouperUi.screenSubjectIcon2.screenHtmlEl.default = ${' '} # localEntities # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.sourceId\\.([0-9]+)$"} grouperUi.screenSubjectIcon2.sourceId.0 = grouperEntities # el for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.screenSubjectIcon2.screenHtmlEl.0 = ${' '} # source for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.sourceId\\.([0-9]+)$"} #grouperUi.screenSubjectIcon2.sourceId.0 = subjectSourceA # el for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.screenHtmlEl\\.([0-9]+)$"} #grouperUi.screenSubjectIcon2.screenHtmlEl.0 = ${' '} # source for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.sourceId\\.([0-9]+)$"} #grouperUi.screenSubjectIcon2.sourceId.1 = subjectSourceB # el for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.screenHtmlEl\\.([0-9]+)$"} #grouperUi.screenSubjectIcon2.screenHtmlEl.1 = ${' '} # source for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.sourceId\\.([0-9]+)$"} #grouperUi.screenSubjectIcon2.sourceId.2 = subjectSourceC # el for icon # ${valueType: "string", regex: "^grouperUi\\.screenSubjectIcon2\\.screenHtmlEl\\.([0-9]+)$"} #grouperUi.screenSubjectIcon2.screenHtmlEl.3 = ${' ' } # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.0 = pennperson # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.0 = user.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.0 = ${subject.description} # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.1 = jdbc # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.1 = user.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.1 = ${subject.description} # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.2 = g:gsa # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.2 = group.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.2 = ${subject.getAttributeValue('displayExtension')} # screen EL has "subjectImg" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.textId\\.([0-9]+)$"} grouperUi.subjectImg.textId.2 = gsa # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.3 = g:isa # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.3 = application.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.3 = # screen EL has "subjectImg" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.textId\\.([0-9]+)$"} grouperUi.subjectImg.textId.3 = isa # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.4 = grouperExternal # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.4 = user_red.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.4 = ${subject.description} #this source doesnt really exist, but it is the image for roles as opposed to groups # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.5 = g:rsa # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.5 = group_key.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.5 = ${subject.getAttributeValue('displayExtension')} # screen EL has "subjectImg" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.textId\\.([0-9]+)$"} grouperUi.subjectImg.textId.5 = rsa #this source doesnt really exist, but it is the image for roles as opposed to groups # this configures how subjects look in the lite UI. This is the short version of the display # images (must be in assets/images dir) for subject source id # source for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImg.sourceId.6 = grouperEntities # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.image\\.([0-9]+)$"} grouperUi.subjectImg.image.6 = application.png # screen EL has "subject" as an object # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenHtmlEl\\.([0-9]+)$"} grouperUi.subjectImg.screenEl.6 = ${subject.getAttributeValue('displayExtension')} # in parts of the UI where there is a long display, this is the long display # ${valueType: "string", regex: "^grouperUi\\.subjectImgLong\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImgLong.sourceId.0 = g:gsa # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImgLong\\.image\\.([0-9]+)$"} grouperUi.subjectImgLong.image.0 = group.png # screen EL long subject # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenEl\\.([0-9]+)$"} grouperUi.subjectImgLong.screenEl.0 = ${subject.getAttributeValue('displayName')} # in parts of the UI where there is a long display, this is the long display # ${valueType: "string", regex: "^grouperUi\\.subjectImgLong\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImgLong.sourceId.1 = g:rsa # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImgLong\\.image\\.([0-9]+)$"} grouperUi.subjectImgLong.image.1 = group_key.png # screen EL long subject # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenEl\\.([0-9]+)$"} grouperUi.subjectImgLong.screenEl.1 = ${subject.getAttributeValue('displayName')} # in parts of the UI where there is a long display, this is the long display # ${valueType: "string", regex: "^grouperUi\\.subjectImgLong\\.sourceId\\.([0-9]+)$"} grouperUi.subjectImgLong.sourceId.2 = grouperEntities # image for subject image # ${valueType: "string", regex: "^grouperUi\\.subjectImgLong\\.image\\.([0-9]+)$"} grouperUi.subjectImgLong.image.2 = application.png # screen EL long subject # ${valueType: "string", regex: "^grouperUi\\.subjectImg\\.screenEl\\.([0-9]+)$"} grouperUi.subjectImgLong.screenEl.2 = ${subject.getAttributeValue('displayName')} # directory to log html # ${valueType: "string"} grouperUi.logHtmlDir = # log html # {valueType: "boolean", required: true} grouperUi.logHtml = false #if comma separated email addresses are here, then errors will trigger emails (ui-lite) # ${valueType: "string", multiple: true} errorMailAddresses = ################################## ## Subject picker ################################## # if putting config files on file system and not classpath, then put the files here # ${valueType: "string"} subjectPicker.confDir = c:/temp/subjectPicker # subject picker config defaults # if the subject should be sent back to the calling page in javascript object # {valueType: "boolean", required: true} subjectPicker.defaultSettings.sendSubjectJsonToCallback = true #comma separated css urls (relative or absolute) for skinning this subject picker # ${valueType: "string", multiple: true} subjectPicker.defaultSettings.extraCss = # when the subject object is sent in Javascript to the caller, which fields or attributes should be sent # {valueType: "boolean", required: true} subjectPicker.defaultSettings.subjectObject.include.subjectId = true # include source id # {valueType: "boolean", required: true} subjectPicker.defaultSettings.subjectObject.include.sourceId = true # include name # {valueType: "boolean", required: true} subjectPicker.defaultSettings.subjectObject.include.name = true # include typeName # {valueType: "boolean", required: true} subjectPicker.defaultSettings.subjectObject.include.typeName = true # include description # {valueType: "boolean", required: true} subjectPicker.defaultSettings.subjectObject.include.description = true #comma separated list of subject attributes or INCLUDE_ALL_ATTRIBUTES for all # ${valueType: "string", multiple: true} #subjectObject.include.attributes = loginid,lfname #comma separated list of subject attributes or INCLUDE_ALL_ATTRIBUTES for all # ${valueType: "string", multiple: true} subjectPicker.defaultSettings.subjectObject.include.attributes = # put sourceIds to search in, or leave blank for all # ${valueType: "string", multiple: true} subjectPicker.defaultSettings.searchInSourceIds = # You can configure per source how the subjects appear on screen, and customize per subject picker instance as well # Increment the index (0, 1, 2, etc) to configure multiple sources #source id we are configuring # ${valueType: "string", regex: "^subjectPicker\\.defaultSettings\\.sourceProperties\\.sourceId\\.([0-9]+)$"} subjectPicker.defaultSettings.sourceProperties.sourceId.0 = #this is the expression language of how the subject result should appear on screen # ${valueType: "string", regex: "^subjectPicker\\.defaultSettings\\.sourceProperties\\.subjectElForSource\\.([0-9]+)$"} subjectPicker.defaultSettings.sourceProperties.subjectElForSource.0 = # max results that can be retrieved before the group filter resultsMustBeInGroup is applied # {valueType: "integer", required: true} subjectPicker.defaultSettings.maxSubjectsResultsBeforeGroupSearch = 800 # max results that can be retrieved # {valueType: "integer", required: true} subjectPicker.defaultSettings.maxSubjectsResults = 200 #if results must be in group, or blank for no check. e.g. put your active employee group here # ${valueType: "group"} subjectPicker.defaultSettings.resultsMustBeInGroup = #if the resource is far down the folder structure, you can remove part of it # ${valueType: "string"} subjectPicker.defaultSettings.removePrefixOnUi = # is an actas should be applied for group operations. Generally this is GrouperSystem, though could be anyone, or blank # to act as the logged in user # ${valueType: "string"} subjectPicker.defaultSettings.actAsSourceId = g:isa # is an actas should be applied for group operations. Generally this is GrouperSystem, though could be anyone, or blank # to act as the logged in user # ${valueType: "string"} subjectPicker.defaultSettings.actAsSubjectId = GrouperSystem # put a URL here where the result (subjectId, sourceId, name, description) will be submitted back # blank if same domain and just call opener directly # ${valueType: "string"} subjectPicker.defaultSettings.submitResultToUrl = ################################## ## Attribute def name picker ################################## # if putting config files on file system and not classpath, then put the files here attributeDefNamePicker.confDir = # attributeDefName picker config defaults #comma separated css urls (relative or absolute) for skinning this attributeDefName picker attributeDefNamePicker.defaultSettings.extraCss = # names of attribute defs where the attribute def names should be searched from attributeDefNamePicker.defaultSettings.searchInAttributeDefNames = # You can configure per source how the attributeDefNames appear on screen, and customize per attributeDefName picker instance as well #this is the expression language of how the attributeDefName result should appear on screen attributeDefNamePicker.defaultSettings.attributeDefNameNameEl = # max results that can be retrieved # {valueType: "integer", required: true} attributeDefNamePicker.defaultSettings.maxAttributeDefNamesResults = 200 # is an actas should be applied for group operations. Generally this is GrouperSystem, though could be anyone, or blank # to act as the logged in user attributeDefNamePicker.defaultSettings.actAsSourceId = g:isa attributeDefNamePicker.defaultSettings.actAsSubjectId = GrouperSystem # put a URL here where the result (attributeDefNameId, displayName, name, description) will be submitted back # blank if same domain and just call opener directly attributeDefNamePicker.defaultSettings.submitResultToUrl = ################################## ## v2.2 UI index ################################## # generally the number of objects in each section # {valueType: "integer", required: true} uiV2.index.numberOfObjectsInSectionDefault = 10 # number of groups, stems, etc on index page to show for favorites. Note, e.g. if this is 5, show 5 max of each # {valueType: "integer", required: true} uiV2.index.maxFavoritesEachType = 5 # number of groups, stems, etc on index page to show for recently used. Note, e.g. if this is 5, show 5 max of each # {valueType: "integer", required: true} uiV2.index.maxRecentlyUsedEachType = 5 # number of millis that widget queries must complete in before they are abandoned and the user must click a link to display it # -1 means dont run in threads, and just draw the screen no matter how long it takes. 0 means, dont even try to load the widgets, # let the user do it themselves # {valueType: "integer", required: true} uiV2.index.widgetMaxQueryMillis = 5000 # if you are testing the widgets, put a sleep there # max widget millis must elapse before the JSP displays uiV2.index.test.sleepIn.recentlyUsed.widgetMillis = 0 # {valueType: "integer", required: true} uiV2.index.test.sleepIn.myFavorites.widgetMillis = 0 # {valueType: "integer", required: true} uiV2.index.test.sleepIn.groupsImanage.widgetMillis = 0 # {valueType: "integer", required: true} uiV2.index.test.sleepIn.stemsImanage.widgetMillis = 0 # {valueType: "integer", required: true} uiV2.index.test.sleepIn.myMemberships.widgetMillis = 0 # {valueType: "integer", required: true} uiV2.index.test.sleepIn.myServices.widgetMillis = 0 ################################## ## External subjects invitation ################################## # if the registration screen is enabled # {valueType: "boolean", required: true} externalMembers.enabledRegistration = false #if admins should be emailed after each action, put comma separated addresses here externalMembers.emailAdminsAddressesAfterActions = #if you want to allow users to delete their record # {valueType: "boolean", required: true} externalMembers.allowSelfDelete = false ################################## ## Invite external members ################################## # group combobox result size # {valueType: "integer", required: true} inviteExternalMembers.groupComboboxResultSize = 200 # if the wheel group is allowed to be invited # {valueType: "boolean", required: true} inviteExternalMembers.allowWheelInInvite = false # if the invitation screen is enabled # {valueType: "boolean", required: true} inviteExternalMembers.enableInvitation = false #if link from new UI # {valueType: "boolean", required: true} inviteExternalPeople.link-from-new-ui = false #if admins should be emailed after each action, put comma separated addresses here inviteExternalMembers.emailAdminsAddressesAfterActions = #if we should allow invite by identifier # {valueType: "boolean", required: true} inviteExternalMembers.allowInviteByIdentifier = false #if we should allow invite by identifier # {valueType: "string", multiple: true} inviteExternalMembers.searchSourcesForMatchesBeforeAdding = ################################### ## Simple permission update ################################### #max size for combobox when filtering attribute defs for permissions # {valueType: "integer", required: true} simplePermissionUpdate.attributeDefComboboxResultSize = 200 #max size for combobox when filtering permission resources # {valueType: "integer", required: true} simplePermissionUpdate.permissionResourceComboboxResultSize = 200 #max users in combobox when filtering # {valueType: "integer", required: true} simplePermissionUpdate.subjectComboboxResultSize = 50 #number of rows to repeat headers on permissions screen # {valueType: "integer", required: true} simplePermissionUpdate.repeatPermissionHeaderAfterRows = 20 #max chars in subject listing in permissions screen # {valueType: "integer", required: true} simplePermissionUpdate.maxOwnerSubjectChars = 50 #if we shouldnt have groups in the subject results # {valueType: "boolean", required: true} simplePermissionUpdate.allowGroupsInSubjectResults = false ################################### ## Simple attribute update ################################### #max size for combobox when filtering attribute defs to edit # {valueType: "integer", required: true} simpleAttributeUpdate.attributeDefComboboxResultSize = 200 #repeat the header of which privilege is which every X rows # {valueType: "integer", required: true} simpleAttributeUpdate.repeatPrivilegeHeaderAfterRows = 20 #max size for combobox when filtering privilege users to add # {valueType: "integer", required: true} simpleAttributeUpdate.attributeDefPrivilegeUserComboboxResultSize = 200 #max size for combobox for search for members in assignment # {valueType: "integer", required: true} simpleAttributeUpdate.memberComboboxResultSize = 200 #when showing assignments, this is the max number of chars before ellipses, -1 for no ellipses # {valueType: "integer", required: true} simpleAttributeUpdate.maxOwnerSubjectChars = 50 ################################### ## Simple attribute name ################################### #max size for combobox when filtering attribute def names to edit # {valueType: "integer", required: true} simpleAttributeNameUpdate.attributeDefNameComboboxResultSize = 200 ################################### ## Groups ################################### #max size for combobox when filtering groups to edit # {valueType: "integer", required: true} simpleGroupUpdate.groupComboboxResultSize = 200 #max size for entity drop down in group privilege screen # {valueType: "integer", required: true} simpleGroupUpdate.groupPrivilegeUserComboboxResultSize = 200 ################################### ## Directed graphs ################################### # {valueType: "integer", required: true} directedGraph.width = 1000 # {valueType: "integer", required: true} directedGraph.height = 600 ################################### ## Internationalization ################################### # this should be false, and make sure URIEncoding is set to UTF-8 in the tomcat connector # Enabled/disabled status # Default example is e.g. "2021/02/01 00:00:00" (see Java SimpleDateFormat for valid formats) # {valueType: "string", required: false} uiV2.group.Membership.dateFormat = yyyy/MM/dd HH:mm:ss # Format string for member start/end dates in group view with Advanced->Point in time audit # Default example is e.g. "2020/10/24 12:43 AM" (see Java SimpleDateFormat for valid formats) # {valueType: "string", required: false} uiV2.group.PITMembership.dateFormat = yyyy/MM/dd h:mm aa # if results must be in certain sources, or blank for no check. e.g. must be in the person sources, comma separated uiV2.subjectSearchRequireSources = # if someone types in a subject ID or identifier, should that search all subjects? if so then blank uiV2.subjectLookupRequireSources = ################################### ## V2 UI provisioning settings ################################### # put in a group here if you want to restrict the provisioning tab to certin users. # note, admins can always see the tab # ${valueType: "group"} uiV2.provisioning.must.be.in.group= # number of records to show by default when showing provisioning logs # {valueType: "integer", required: false} uiV2.provisioning.logs.default.page.size = 100 # seconds to wait until refresh # {valueType: "integer"} uiV2.provisioning.diagnostics.progressRefreshSeconds = 5 # pause in between records to test the progress, set to a few thousand perhaps # {valueType: "integer"} uiV2.provisioning.diagnostics.pauseInBetweenRecordsMillis = 0 # if should use threads # {valueType: "boolean"} uiV2.provisioning.diagnostics.useThread = true # seconds to wait until progress starts # {valueType: "integer"} uiV2.provisioning.diagnostics.progressStartsInSeconds = 10 ################################### ## V2 UI loader settings ################################### # put in a group here if you want to restrict the loader tab to certin users. # note, admins can always see the tab # ${valueType: "group"} uiV2.loader.must.be.in.group = # put a group here if you want these users to be able to edit loader jobs # ${valueType: "group"} uiV2.loader.edit.if.in.group = # if group admins can see the loader tab # {valueType: "boolean", required: true} uiV2.loader.view.by.group.admins = true # how many logs to display on screen # {valueType: "integer", required: true} uiV2.loader.logs.maxSize = 400 # max that a user could specify # {valueType: "integer", required: true} uiV2.loader.logs.maxMaxSize = 5000 ################################### ## V2 UI instrumentation settings ################################### # should show instrumentation? # {valueType: "boolean", required: true} uiV2.admin.instrumentation.show = true # restrict access based on this group, by default only admins can see # note, admins can always see the screen # ${valueType: "group"} uiV2.admin.instrumentation.must.be.in.group = ################################### ## V2 UI daemon jobs settings ################################### # should show daemon jobs? # {valueType: "boolean", required: true} uiV2.admin.daemonJobs.show = true # restrict access based on this group, by default only admins can see # note, admins can always see the screen # ${valueType: "group"} uiV2.admin.daemonJobs.must.be.in.group = # how often to refresh the page (in seconds). -1 to disable # {valueType: "integer", required: true} uiV2.admin.daemonJobs.refreshInterval = -1 # how many times to refresh the page # {valueType: "integer", required: true} uiV2.admin.daemonJobs.refreshCount = 30 # comma separated list of additions to the common filter drop down on All Daemon Jobs screen drop down # {valueType: "string", required: false, multiple: true} uiV2.admin.daemonJob.commonFilterAdditions = # format string for job schedule times visible in Daemon job "show extended results". # Default format is e.g. 2020-10-23 13:59:50 EDT (see Java SimpleDateFormat for valid formats) # {valueType: "string", required: false} uiV2.admin.daemonJob.extendedSchedule.dateFormat = yyyy-MM-dd HH:mm:ss z ################################### ## V2 UI admin settings ################################### # should show subject api diagnostics? # {valueType: "boolean", required: true} uiV2.admin.subjectApiDiagnostics.show = true # put in a group here if you want to allow the subject API diagnostics to certin users. # note, admins can always see the screen # {valueType: "group"} uiV2.admin.subjectApiDiagnostics.must.be.in.group = ####################################### ## Grouper templates ####################################### # class that implements this service template # {valueType: "class", regex: "^grouper\\.template\\.([^.]+)\\.logicClass$", mustExtendClass: "edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperTemplateLogicBase"} grouper.template.service.logicClass=edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperNewServiceTemplateLogic # class that implements this service template # {valueType: "class", regex: "^grouper\\.template\\.([^.]+)\\.logicClass$", mustExtendClass: "edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperTemplateLogicBase"} grouper.template.policyGroup.logicClass=edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperTemplatePolicyGroupLogic # class that implements this tier structure template # {valueType: "class", regex: "^grouper\\.template\\.([^.]+)\\.logicClass$", mustExtendClass: "edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperTemplateLogicBase"} grouper.template.tierStructure.logicClass=edu.internet2.middleware.grouper.grouperUi.beans.ui.GrouperTierStructureLogic ####################################### ## Configuration in ui ####################################### # allow configuration from ui # {valueType: "boolean", required: true} grouperUi.configuration.enabled=true # allow configuration only from these IP ranges, e.g. 1.2.3.4/32 or 2.3.4.5/24, comma separated, set to 0.0.0.0/0 if available from everywhere # {valueType: "string", multiple: true} grouperUi.configurationEditor.sourceIpAddresses.elConfig = ${elUtils.processEnvVarOrFile('GROUPER_UI_CONFIGURATION_EDITOR_SOURCEIPADDRESSES')} # if the source IP is set by apache or proxy or whatever # {valueType: "string", sampleValue: "X-FORWARDED-FOR"} grouperUi.reverseProxyForwardedForHeader = ####################################### ## Import ####################################### # if should use threads # {valueType: "boolean"} grouperUi.import.useThread = true # seconds to wait until progress starts # {valueType: "integer"} grouperUi.import.progressStartsInSeconds = 10 # seconds to wait until refresh # {valueType: "integer"} grouperUi.import.progressRefreshSeconds = 5 # pause in between records to test the progress, set to a few thousand perhaps # {valueType: "integer"} grouperUi.import.pauseInBetweenRecordsMillis = 0 ############################################# ## Developer settings ############################################# # if you're developing, it will refresh configs and text etc on every UI request (no nneed to compile, build, restart, etc) # note this affects caches if you are working on something that relies on caching # you should only set this to true while working on externalized text etc, then set back to false for final testing # {valueType: "boolean", required: true} grouperUi.refreshCaches.onEveryRequest = false