Could you please help me to get the actual display value. The fact is, almost every single ServiceNow customer who has done a service catalog implementation and used a list collector variable uses a script like this. and our EXE. Only do this for a few Categories for the time being. all the best, -e. If I use the onLoad script this works perfectly, except that the focus of the form drops down to the list collector. There is a list collector variable on the form that should only display values based on the auto populated variable. Please keep us up-to-date on any modifications or improvements you make. We have an issue where we used this script to set the filter to active on loading the field and it was working great prior to Berlin. You can send a copy of your script then well check the problem. Did you change it so that it has the name of your variable? You might have to use setTimeout to create a small delay before the script actually executes. }); In this situation we are using a Record Producer in a Service Catalog that creates Incident data. It will be very difficult for the fulfiller who are working on the respective task associated to given request item to see all the variable. What changes do i need to make in your script? Has 90% of ice around Antarctica disappeared in less than a decade? San Diego. Where watch_list is whatever you named your list collector. I believe its synchronous but Im not positive. For details on creating a variable, see Create a service catalog . In order to do that you need to do the following: Aha, gel(YOURVARNAMEHERErecordpreview).hide(); worked!!! It only takes a minute to sign up. ` 1. ServiceNow pretty severely restricts the variable g_form API on back-end forms. Ive updated the article above accordingly. if(typeof(window[collectorName + g_filter]) == undefined){ fil.rows[1].style.display = none; They are able to set the variables in the variable set mandatory, but that does not prevent the end-user from submitting the request Loading. Mark, hey this method works as expected in Chrome but not in IE 10 in IE7 Standards Mode. Do you have any idea why? Reddit and its partners use cookies and similar technologies to provide you with a better experience. }. Say you had a choice list of var form = typeof g_sc_form != undefined ? Is it possible to put an condition in the attribute field? Im not sure. My script is getting stuck in checking the time out and it goes on a loop. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. Note that the variable name shouldnt be confused with the variable label (you are probably already aware of that though). Weve found that the .style.display properties that suppress the filter widget elements was broken somewhere between patch 5 and 10. In this piece let us try to filter a Group catalog variable by Active, and filter the Member variable based on the the selected Group using Reference Qualifier. The way to add variables in the tasks without having to go through the workflow slush bucket (Catalog task activity) There are two ways to add the variables on the catalog task: Through the catalog task Does Cosmic Background radiation transmit heat? Hi I have a problem: I call a Script Include in the assignmnent_group field of the incidents but unfortunately I found the same call also in the assignmnent_group of Changes and Problems. Thats where your filter magic has helped. Populate as many categories as you would like in here. The values populated in one field can determine the values in another. April 25, 2022. After we made some base categories lets make some matching subcategories. For those of you working with record producers and building out dynamic pages, you may be aware that this can be a bear to work with. Our Recruiting team is 100% certified by the AIRS Certified Diversity and Inclusion Recruiter course. Is email scraping still a thing for spammers. I was able to successfully use your code to filter two list collectors on my catalog request form. On the MRVS set the default value based on that preference. In my testing it seems to work fine on a Helsinki instance for me. I would give it a test in a ServiceNow demo instance and potentially contact ServiceNow support to take a look. For example: you . WHEN 'WPIYWEEK'. I am stuck with new requirement from my client, the requirement says to make the filter dynamical set read-only so that no one can change it. See this post for details. February 27, 2023 . Install the ATF scoped application (to give you a form with a MRVS and other variables). Ive also re-written the code so that you only have to type in the list collector variable name one time per script. By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. Ive provided a second example above that shows you how to do that. You need the element to match the element you created in sys_choice, Reference Qualifier: javascript:'name=incident^element=subcategory^dependent_value=' + current.variables.category. g_sc_form : g_form; setTimeout(function(){ You will find two different solutions to this requirement depending on your situation. I have checked the ACLs on list collector table, and the non-admin user is having access to that table. Thank you. There were more than fifty fields on a single form, spanning six variable sets, with scripts squirrelled away in UI policies and a variety of client scripts to manage the complexity of the process. You may like to know that you can add no_filter in the attribute field on the list collector to hide the filters now. Im currently in the Geneva release, any idea why the filter would work on the initial request form, but not in the variable editor view after the form has been submitted? The form loads and you see the values in the filter, but there are no results. The use of the Event.observe to watch for window.load is not supported in the onLoad client script and should not have been used in this way. Thanks for lighting fast reply. Find centralized, trusted content and collaborate around the technologies you use most. For example, when form is opened, a custom dropdown field "Location" (Location as Data Source) would autopopulate with the requestor's Location value that is in their User record. The primary thing to note is that you probably don't need to export these variables; that necessity is reserved only when when a subprocess is querying its inherited environment for a variable. Older builds didnt allow you to uniquely identify list collectors by variable name. this solution does not work on firefox. New post: Application Portfolio Management (APM) assessment challenges servicenowguru.com/service-now-mi, New post: Knowledge Translation using Localization Framework and Azure servicenowguru.com/knowledge-mana, New post: Localization framework fulfillment (LP, LRITM, LFTASK) servicenowguru.com/uncategorized/. ai thinker esp32 cam datasheet Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. I used this script and it worked for me. Which basecaller for nanopore is the best to produce event tables with information about the block size/move table? In this case, Im using a Script Include named u_backfillAssignmentGroup. Since 2009, ServiceNow Guru has been THE go-to source of ServiceNow technical content and knowledge for all ServiceNow professionals. Works like a Charm! The article above has been updated to reflect these changes. I have tried ACLs, making the tables inactive and clearing the class name for the particular CI Tables in the language table but none of these seem to remove the choices when the class field is selected in the filter? Here's mine. return; if (filter.getFilterReadOnly()) So we'll need to create a script include that's client callable. We have this built out in our sub prod instances has been working great for a few weeks with the exception of when current user does not contain the same rights as the role that write is assigned to. servicenow catalog variable types (75) 3625-3013 [email protected] LOJA 2 Av. Thanks for the help. This script came out of the following conversation on the community Slack (or Discord; I forget): I am looking for a way to generate sys_history_set records for a given task, without the user having to actually visit the task. And you could potentially set up ACLs to hide the data you dont want to be seen too. With that upgrade we will start using the Service Portal instead of the ESS (CMS) portal solution we currently use. Not the answer you're looking for? Linux is a registered trademark of Linus Torvalds. The risk is an infinite loop if you dont return immediately after the setTimeout call. Thanks for the contribution! The number of distinct words in a sentence. It allows the user to select multiple items from a list of items and optionally filter those items to help in their selection. So now that those parts are happening here's what's occurring; When your user sets the "Date" variable, you are creating or updating that user'ssys_user_preference. Previous items stay in Right hand side of LC Now that we are here, lets sort by the Incident table. window[collectorName + g_filter].setQuery(filterString); Can I use another reference qualifier and I'm just not thinking of the right query to run or would this require something like a catalog client script. //Test if the g_filter property is defined on our list collector. I have tried this but get an error saying var_nameg_filter undefined. sandy. On-demand functions will only work if you make sure that the name of your script include matches the name of your function EXACTLY! This training provides our recruiters with tools and strategies to improve our diversity and inclusion efforts. You could use g_sc_form with the getControl method. Types of service catalog variables. I've updated the article. Something like this should work. I use on-demand functions all the time for Advanced Reference Qualifiers. fil.rows[1].style.display = none; when i execute the script file, my first variable gets loaded, while the second doesn't: it's because after loading the first variable host, it doesn't remember its value to use for setting the second variable index. eval(ctrl + g_filter.query = + filter + ;); Does Cast a Spell make you a spellcaster? It would depend entirely on when a built-in asynchronous call finished compared to when our filter was applied. }. We have a form that needs to have a list of users that have the requesting(user) as their manager. Its Awesome. There isnt. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. I have to go in, re-do the filter manually and run. Well done. I generally will use all lowercase with underscores if I need to include spaces in values. Concurrency Inc, is a Milwaukee based ServiceNow Elite Partner and a Microsoft Gold Partner. By accepting all cookies, you agree to our use of cookies to deliver and maintain our services and site, improve the quality of Reddit, personalize Reddit content and advertising, and measure the effectiveness of advertising. In this case, I'm using a Script Include named 'u . ServiceNow offers a handy little feature on forms that use choice lists. Group types are stored in the sys_user_group_type table. Keep it up. eval(ctrl + acRequest(null)); Just make sure you set the UI type field on the client script form to Both. Just make sure that the name of your variable is configuration_items or that you change the script to match your variable name. Go to Service Catalog -> Maintain Items and click on 'New'. What is the best way for getting the values selected in list_collector at cataloge to the form level? do you now the what the meaning of the parameter of the XXX_acRequest(null) function is? However, on this new item we are building we have run into an issue, when the list collector variable has write set to admin, when a non SN admin fills out the request, the filter will not apply. The reference field filters Business Services related to the company of the caller, I created a m2m table with a related list on both Company as well as Business Services. Thanks for the help Mark. Using that posts method, I was able to get a result, but it was not the actual sys_id of the variable itself. //var collectorName = df_uat_tcycle_servers; If you have any simple queries, you could directly copy it from your list view filter and paste it in the field. My use-case is that I have a script using sys_history_line records to get an array of all assignment groups to which a given task has ever been assigned. Many thanks, Merry Christmas We have a use case where as provider I'm providing Devices and Services to the customers. Since Script Includes now allow you to use On-Demand functions, your script is identical to the one you would use in a global business rule. That would reduce the complexity of this a bit. You can add this in your reference qual, Here requested_for is the variable that stores requester name, For your case, you could add the query as. The first piece is the Reference qual field value on the dictionary entry of the reference field (Assignment group in this case). How do I force the focus to either remain at the top of the page or return there immediately after completing the filter? The post Certified Diversity Recruiters appeared first on Crossfuze. But I could be mistaken. I think thats probably your problem. 542), How Intuit democratizes AI development across teams through reusability, We've added a "Necessary cookies only" option to the cookie consent popup. The post Diversity, Inclusion, & Belonging Training appeared first on Crossfuze. New post: Application Portfolio Management (APM) assessment challenges servicenowguru.com/service-now-mi, New post: Knowledge Translation using Localization Framework and Azure servicenowguru.com/knowledge-mana, New post: Localization framework fulfillment (LP, LRITM, LFTASK) servicenowguru.com/uncategorized/. Give it a try and let me know how it goes! ERROR at line 9: Expected an assignment or function call and instead saw an expression. After that I have another variable (read-only) that, based on the asset chosen, should populate with the serial number for the asset. Just the convention Im used to. ` On the Test Item, look at the related variable set. The functional equivalent using Event.observe syntax for what I coded would be: Is there are reason why you choose the window.onload event instead? For dropdown fields in Service Catalogs, is it possible to autopopulate field values with reference data? Is there is any default setting where I can configure to get Display Value. The reference qualifier here is important. *Read the value of variable which used has entered on sel. Software //Reset the filter query I know there is no list_collector variable in form, I have 3 option slushbucket, glide_list and field_list. Even the most proficient developers need reference material from time to time. S. ervice catalog variables can be a challenge to deal with on standard forms when they are displayed in a variable editor. variable name to apply ref qual filter: retail_equipment. nameOfCollectoracRequest(null); We found that this script doesnt always work in Geneva. var filterString = u_tomcat_group=799d6e58206705486fc1cca07d6f3232; //Find the filter elements }); On change of the main form's variable, set the preference. Multi-row variable sets (MRVS) are a fairly recent addition to the Service Catalog in ServiceNow, having been introduced in the London release. That whole page isnt really customizable at all. remember the set variable value in a for loop. eval(ctrl + g_filter.setQuery( + filter + )); the parsing loop above can result in false-positives. That being said we have requirements that users can categorize their own tickets, else the ITIL team will categorize them after submission anyway. Secondly they want to be able to add more filter as per there requirement. If you have any consultation requests, or would just like to chat - please feel free to reach out to [email protected]. Subscribe to get the latest news, events, and blogs. you can use it on Service Catalog variables as well. In Demo they are running Calgary and we are on Berlin. ( Table only have one column and many record created for that column). On a side note, you should protect your variables with ${}. Found the issue I create a request for Server-StorageBox and once the request is fullfilled it will create a relationship in a table. Should I include the MIT licence of a library which I use from a CDN? . I had to change the last lines: window[collectorName + g_filter].reset(); On the MRVS set the default value based on that preference. screen READ TABLE i_t_var_range INTO wa_var_range WITH KEY vnam = 'WPIFYEAR'. Jordan's line about intimate parties in The Great Gatsby? By default it sets a filter where 'name != null' and 'sys_class_name (CI type)' is anything. as an aside, the above loop will ensure that you are not executing the file as it's parsed out. I tried to use the code mentioned on top, but it does not remove the existing values. fil.nextSibling.rows[0].style.display = none; //Filter description text*/, //Reset the filter query Unfortunately not good news from SN. Hardware Here's that code. You could apply a filter to the list collector by modifying the answer line to be something like this. function filterSlushbucket(ctrl, filter) { Selecting Run Filter does not work. watch_listg_filter.setQueryAsync(active=true); Checking the display box works ..but is there any other way to make a particular column values available in List Collector. If it isnt, then you can try using the script or error console in your browser and see if there are any errors. The gel(ep) command doesnt distinguish between the variables, so how can I target the specific variable that I want? Gracias in advance. Hi Mark, Sorry for the late reply. We'll be using the MRVS and the Date variable. I have a query on setting filters fil.rows[0].style.display = none; I actually was able to do this by simply adding the no_filter attribute to the variablenot sure why that wasnt done in the first place! You should also look at your browser error console to see if there are any error messages. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. Then it computes newvar based on what the values of var1 and var2 are. Can I use this tire + rim combination : CONTINENTAL GRAND PRIX 5000 (28mm) + GT540 (24mm), Change color of a paragraph containing aligned equations. Applications. Thank you! I'm working on a catalog item that has a variable referencing the alm_hardware table that uses a qualifier to filter out only assets based on the cost center chosen (another variable): javascript: 'model_category=xxxx^install_status=x^cost_center='+current.variables.costcenter. In the default value of the variable, try, In the MRVS, add an onChange Client Script for the first variable to read the, (Didn't try this), on the main form, add an onChange Client Script for the. I have written a catalog onChange script to filter the list collector. Hey Bill, Im glad youve found something useful here. Here is a nice blog on the same topic: link. Letting users select categories may be specific to the scope of the clients work. You only have control over what fields appear below the list collector when you click a record. //listFilter += '^ORlocation.name='+searchText; //listFilter += '^ORsupport_group.name='+searchText; //What lies below will only get executed if the list collector has rendered and has g_filter properties available. Your shell is expanding $myexportedvar before somecmd ever sees it. Do any one has idea where I am doing wrong. While upgrading I noticed that this client script does not work in the Service Portal. Finally, you dont have to do the reset() call, since setQuery does that itself. Ive tried changing the order of the client scripts as well as the timeout values in each client script w/ no avail. in Bex *Check for Step 2 (After user gives inputs on selection screen) CHECK i_step = c_after. Once you have this entered click Submit. We setup a few list collector filters as outlined in this post and everything seemed to work fine until we impersonated a non SN Admin or ITIL user and then it does not work. On change of the main form's variable, set the preference. I am expecting to get all value from the table in available section. i know, but my actual file is too big and filled up with variable definitions, that i want to, as an aside to your aside, one should only use curly braces for two things: disambiguation between a variable's name and other coinjoined text, Setting a variable whose value depends on another variable, The open-source game engine youve been waiting for: Godot (Ep. If you take the code back to the standard example provided in the article it should work. rev2023.3.1.43269. //Apply a default filter to the list collector variable I didnt try getDisplayValue. This reference lists available classes and methods along with parameters, descriptions, and examples to make extending the ServiceNow platform easier. eg You have a list collector on incident table to display all incidents assigned to requester. / servicenow catalog variable types. I have managed to get the filter set, however it will not run automatically. I am using task defination table and cannot override dictionary entry value. Stack Exchange network consists of 181 Q&A communities including Stack Overflow, the largest, most trusted online community for developers to learn, share their knowledge, and build their careers. This is a form that a manager requests (exp limits, permission on applications , etc.) While creating list_collector variable in service catalog I put this new table as a List Table. See the following sections for more details on each variable type. Has Microsoft lowered its Windows 11 eligibility criteria? Mark, A while agoI wrote aboutusing Dependent variables in a Multi Row Variable Set (MRVS). and the choice was Software, END DATA. After that's created we can set the preference with a client script. So we should have an officially supported method sometime in 2014, if were lucky . //Hide the list collector until weve set the filter You'll be adding a new function in front of this one, with your logic. The hiding of the filter itself no longer works in Fuji. So SN may have a better way of doing this, but since they havent cared to document it I came up with my own function which accomplishes the task. //Type appropriate comment here, and begin script below Below is a simple example to illustrate. the query works fine, but once the user clicks Add filter button and adds the desired filter and clicks upon the Run filter button, The filter does not works upon the filter entered by the User ? I need it to run both when the form shows up, and if needed, when someone also runs an additional filter. Each list collector is its own variable set. It is recommended that new . Its also a fact that ServiceNow ships with the Prototype library, so you would think they would support the common pieces of that library. Lets try it out! servicenow catalog variable types. How to properly visualize the change of variance of a bivariate Gaussian distribution cut sliced along a fixed variable? Any ideas? Ive updated the code above to include this check. Asking for help, clarification, or responding to other answers. In available section it possible to put an condition in the Service Portal has! In Bex * check for Step 2 ( after user gives inputs on selection screen ) i_step! For nanopore is the best way for getting the values in the collector! Know that you change it so that you can use it on Service catalog variables as well applied. Post Certified Diversity recruiters appeared first on Crossfuze, so how can I target the specific variable that want! Was broken somewhere between patch 5 and 10 content and knowledge for ServiceNow... Script to filter the list collector variable on the test Item, look at browser... With the variable name should have an officially servicenow set variable based on another variable method sometime in 2014, if were.! At line 9: expected an Assignment or function call and instead saw an expression w/ no avail the. ) function is to work fine on a loop to other answers for... Try and let me know how it goes need it to run both when the form that needs to a. @ casadohospital.com.br LOJA 2 Av ServiceNow offers a handy little feature on forms that use choice lists with variable... Always work in the Great Gatsby gt ; Maintain items and optionally those. News from SN something like this eval ( ctrl + g_filter.query = + filter + ; ) in. Mrvs set the default value based on that preference produce event tables with information about the block table! A result, but there are any errors a client script does remove... 90 % of ice around Antarctica disappeared in less than a decade Diversity recruiters appeared first on Crossfuze 'name=incident^element=subcategory^dependent_value=... You take the code above to include this check / logo 2023 Stack Exchange Inc ; user licensed... Create a script include named u_backfillAssignmentGroup our terms of Service, privacy policy and cookie policy aside... With information about the block size/move table variable, set the default value based on the. Servicenow support to take a look variable, see create a small delay before the script actually executes can! In each client script w/ no avail add no_filter servicenow set variable based on another variable the Service Portal when someone also runs an filter! Where I am doing wrong that the name of your variable name one time per script patch 5 and.. Idea where I can configure to get the filter set, however it create. Instance and potentially contact ServiceNow support to take a look filter query servicenow set variable based on another variable know there no. The functional equivalent using Event.observe syntax for what I coded would be is... Jordan 's line about intimate parties in the list collector table, blogs. Based on that preference to go in, re-do the filter itself no longer works in Fuji in false-positives to... For more details on creating a variable, see create servicenow set variable based on another variable script include named & # x27.. Demo instance and potentially contact ServiceNow support to take a look to give you a form that a requests. New table as a list collector when you click a record Producer in a Row! Determine the values of var1 and var2 are bivariate Gaussian distribution cut sliced along a fixed variable do.... Collaborate around the technologies you use most know that you only have control over what fields appear below list..., however it will not run automatically MRVS set the preference with a better experience anyway... Exchange Inc ; user contributions licensed under CC BY-SA I need to a... Ess ( CMS ) Portal solution we currently use is it possible to autopopulate field values with data. Producer in a ServiceNow demo instance and potentially contact ServiceNow support to take a look many as! Licence of a bivariate Gaussian distribution cut sliced along a fixed variable i_t_var_range INTO wa_var_range KEY!, //Reset the filter widget elements was broken somewhere between patch 5 10... To make extending the ServiceNow platform easier that have the requesting ( user ) as manager. Licence of a library which I use from a list of var form = typeof!. Mentioned on top, but it was not the actual display value is stuck. Team will categorize them after submission anyway 2009, ServiceNow Guru has been the go-to source of ServiceNow content. A filter to the scope of the clients work items and click on #! All lowercase with underscores if I need it to run both when the form that needs have... Same topic: link that suppress the filter widget elements was broken somewhere between patch 5 10... I was servicenow set variable based on another variable to successfully use your code to filter two list collectors on my catalog request.. An Assignment or function call and instead saw an expression training appeared first on.! That being said we have requirements that users can categorize their own tickets, else the team. ( table only have to servicenow set variable based on another variable in, re-do the filter itself no longer works Fuji. Longer works in Fuji Diversity, Inclusion, & Belonging training appeared first on Crossfuze, reference Qualifier javascript! That upgrade we will start using the script actually executes is having access to that table ll using... Filter widget elements was broken somewhere between patch 5 and 10 a challenge to deal with standard! The risk is an infinite loop if you have any consultation requests, or to! Trusted content and collaborate around the technologies you use most potentially set up ACLs to hide the filters now for! - & gt ; Maintain items and click on & # x27 ; ll be the... Use it on Service catalog that creates Incident data lists available classes and along! The scope of the variable label ( you are not executing the as. Set the preference where I can configure to get the filter set, however it will not run automatically Assignment... Fil.Nextsibling.Rows [ 0 ].style.display = none ; //Filter description text * /, //Reset filter... Builds didnt allow you to uniquely identify list collectors on my catalog request form the element created. Creating a variable editor I put this New table as a list collector on Incident table and the non-admin is... This a bit on what the values selected in list_collector at cataloge to the of! The client scripts as well as the timeout values in another window.onload event instead itself no longer works in.! Values selected in list_collector at cataloge to the form loads and you could apply a to! A relationship in a ServiceNow demo instance and potentially contact ServiceNow support to take look! Have a list collector variable name to apply ref qual filter: retail_equipment exp! { } not executing the file as it 's parsed out a requests... Based ServiceNow Elite Partner and a Microsoft Gold Partner logo 2023 Stack Exchange Inc user. A try and let me know how it goes on a side note, you agree our! The MIT licence of a bivariate Gaussian distribution cut sliced along a fixed variable Answer you... Around Antarctica disappeared in less than a decade something like this protect your variables with $ { } on situation! Standard forms when they are displayed in a table populated variable we & servicenow set variable based on another variable x27 ; in.. Provided a second example above that shows you how to do that a challenge to deal with on standard when! Table and can not override dictionary entry of the reference field ( Assignment group in this situation we are,! A MRVS and other variables ) I force the focus to either remain at the top of ESS. And similar technologies to provide you with a client script w/ no.... Filter to the list collector on Incident table time for Advanced reference Qualifiers have do... The above loop will ensure that you only have control over what fields appear the. Those items to help in their selection infinite loop if you have list. Setquery does that itself variables ): g_form ; setTimeout ( function ( ) call since! Collector by modifying the Answer line to be something like this after completing the filter widget elements broken! An infinite loop if you make have a list table immediately after the setTimeout.! Instead of the parameter of the ESS ( CMS ) Portal solution currently... Tables with information about the block size/move table it so that it has the name your... Portal instead of the clients work, filter ) { you will two! Below is a nice blog on the form shows up, and blogs glad youve found useful! If it isnt, then you can try using servicenow set variable based on another variable MRVS and other variables ) ervice catalog can! Platform easier matches the name of your function EXACTLY and if needed, when someone also runs an filter... Trusted content and collaborate around the technologies you use most control over what fields below... Clarification, or would just like to know that you change the or... $ { } can try using the script to filter two list collectors on my catalog request form target specific. The latest news, events, and if needed, when someone also runs an additional filter then... = undefined the above loop will ensure that you can use it on catalog... Work in servicenow set variable based on another variable article it should work a challenge to deal with on standard forms when are! A library which I use on-demand functions will only work if you have list! By variable name shouldnt be confused with the variable itself after that 's client.... The related variable set ( MRVS ) meaning of the parameter of the clients work of var1 and are... Manager requests ( exp limits, permission on applications, etc. field value on the auto variable... As you would like in here an aside, the above loop will ensure that you can no_filter!
What Did People Do For Entertainment In Ancient Times, Articles S