How do I make all the text show up in a list item when it is long?

Thank you so much for your patience with me and your helping me step-by-step when I get stuck! I so appreciate it.

Also–I want to allow users the ability to add their own items in the list that they write themselves, but that only shows up for them in the user-side database. I tried to do this on another page, too (contacts) and I got stuck. I tried this using the video Power-up: Forms and Form Validation - Composer

I created client-side database called “MyOwnCoping” with three properties, id, title, and description. Then i added a data variable NewMyOwnCoping to the page, set as new data record. I bound the input fields value Title to NewMyOwnCoping.Title and Description NewMyOwnCoping.Description.

On the logic canvas for the button, I added “create record” and bound it to resource name MyOwnCoping, and record properties NewMyOwnCoping. Then I connected a “set data variable” to the “create record” in order to clear the filled out inputs, binding data variable name to NewMyOwnCoping and leaving the custom object as empty, as shown at 3:18 in the video. BUT on my app it failed to clear the input area.

AND i think it’s failing to add the info to the database, because after I created a collection of database MyOwnCopingList and added it to display (as in the video) it fails to show up… I’m hoping you might have a suggestion.

Also, do I need an if formula if i don’t care whether the user puts both title and description? Or will that mess up the database if I don’t add it?

Hi again Cecilia (smiling at you),
Also, is there any way that I can add links or open page to the lists that I make through the variables page? I’m guessing not because I don’t see an area. I was just hoping, because the way I had it before, some items had links that the user could tap on. But we did it this way so I could allow users to favorite items, and that’s more important.

To access the individual items and their title and description, you’ll need to use the repeat with for either the container or the large list item, and repeat FavoriteListItems. Then you’ll be able to access current.title and current.description

As for creating your own items, and it sounds like you did every step right. The only thing I can think of is that maybe the NewMyOwnCoping is missing the id and therefore the creation fails? You can try changing the record properties in Create record to Object with properties, and use NewMyOwnCoping.title and NewMyOwnCoping.description, and use the formula GENERATE_UUID for the id. If that doesn’t help, let me know! That might be the reason the data variable is not clearing either, if the creation fails and it never gets to the Set data variable node.

The database should be fine without a title and description, they should just be empty in that case.

About adding links, If I understood correctly, if the user clicks on an item it takes them to a certain page? Creating a dynamic Open page (i.e. binding the Open page target page to a variable) is quite impossible, Open page should always have a static target page, like a item-detail page which content depends on what item was clicked. Here’s an example that might better explain what I mean :slight_smile:

Hi Cecilia (smiling at you),
Sorry for the delay; it’s been a work-crammed week.

For the separate My Favorites page, I did have the large list items container repeating with FavoriteListItems1. I just checked, and what I’d forgotten to do was, when selecting the title, choose the “property of data item in repeat”! (slapping forehead). So that is working now. PHEW and YAY!!! (Except one of the favorites, the one at the top, is showing up as blank and I’m not sure why. But the others are listed.) Thank you!!!

I’m stuck again. (so sorry!) On the Distract Yourself page, for the input, where I change the record properties in Create Record to Object with Properties, and use NewMyOwnCoping.title how do I get there? What I did was go to the logic canvas, Create Record, then on Record Properties I changed the binding to object with properties. Then when the description, title, and ID page pops up, I tried to bind the title to MyOwnCoping.title by clicking on the ABC next to the title, then Data Variable, then selecting NewMyOwnCoping, but it says that those three items are incompatible. And where exactly do I put the formula GENERATE_UUID? I don’t see how I can link a formula to the binding when I’m binding (trying to bind) NewMyOwnCoping to it?

For creating links, I meant links that go outside the app to a webpage. (I had also wanted to add open page links, but the most important ones are links to the web). Is there any way to add links to the web from an item in the list the way I’ve done it? I’m guessing not.

Hi again, Cecilia (smiling at you),
Is there a way I can allow some test users to try my app without my uploading it to the android or apple store, and without giving them my login for Appgyver?

Sounds again like great progress! :tada:

As for the one favorite item not showing up on the list, if all other items are showing then I’m guessing there’s something off with the data, that at some point an empty record was added to the favorites list when we were trying to get it to work before. This shouldn’t be an issue for future use though, as the adding should work fine now :slight_smile: if you want it hidden, you could bind the visibility of each repeating item to e.g. !IS_EMPTY(current.title) . Is the item does not have a title, then it doesn’t show in the list.

hmm sounds like you’re doing everything with the NewMyOwnCoping right. However it’s easy to get lost in the binding trails :grin: Here’s screenshots you should be able to follow, let me know if something is off for you:


Click on custom object


Click on binding for the description


Choose Data and variables and data variable after it


Choose the data variable, and you should be able to choose description under it:

Does this match for you?

To use GENERATE_UUID you can click on the ABC next to the id property (like in my second screenshot) and select Formula as the binding (like you can see in my third screenshot). Then the formula editor should pop up, and you are able to put in the GENERATE_UUID() . So you end up like this:

As for the links for each item, you can add the property link to the app variable that holds all your items, set its type as web URL, and add each url to every item. Then, in the flow functions market, you can find the function Open url, and add that to the repeating component, for example like this:

As for testing, it is almost impossible to test iOS apps easily due to Apple’s policies. I at least am not aware of other options than to either share your appgyver account (perhaps not recommended) or run it through the apple store for testing. Android is a bit easier, as Google is not as strict. You should be able to share the built apk file to any user you want and they can install it to their device. In either case you’ll need to build your app, here’s our documentation for that

It WORKED! Oh thank you, thank you Cecilia! (beaming at you) I was stuck on the formula for the ID and where to put it, and because I couldn’t figure it out i couldn’t move forward, but now it WORKS! (beaming more) I appreciate you help SO much.

But now I realize…I need to add the option that the user can delete what they inputted–their own favorite ways of coping–if they don’t want them any more.

And also, when their favorite way of coping shows up it is all in one line or two, with just a comma separating the title from the description. How do I make it look like my list items, with an image to the left, and the title in bold and separate from the description paragraph? Can I do that?

For testing, if I build the apk file, can I still edit and add to the app? (I’m guessing so?) Is there any downside to my building it now to show a few people? Or should I wait until I have everything I think should be done, done? (Probably I should wait?)

Thank you,
Cheryl

You can build the own copings the same way as the original list of items you have, just set a Large image list item, repeat it with the data resource of your own copings, and set the texts as current.title, current.description etc. For the image you can either use a standard image for each own item, or modify the schema of the OwnCopings to include an image_url property and let the user choose the image for each item as they create their own item. Then the image can be bound to current.image_url.

And just like you have the favoriting heart button, you can set a remove button and use Delete record and current.id to remove them from the data resource, similar to what we did with the favoriting (except here we don’t need the IF checks).

Yes after building you can still edit the app! And every time you want to show a new version, you’ll have to build it again and distribute the new build. But that’s not much work, you only need to set the build configurations once and then you can make new builds with just a couple of clicks. There’s not really any major downsides to building it now and testing it, so it’s up to you when to do it! Just as long there’s not any major blocking bugs to fix first, so that your testers can actually use the app and not get stuck somewhere completely :slight_smile: but that’s not the end of the world either, then you can just fix them on the go and build a new version.

Thank you, thank you SO much, Cecilia! I am so grateful for all your help!

I got the “My Own Positive Distractions” showing up with the large list items; I love it! And I added an x icon and connected it to delete record so people could delete it, and got it working. Then I thought maybe people would also want to be able to add their My Own Positive Distractions into the Favorites list, too, so I added that button as well and got it working. (beaming)

BUT If I favorite a “My Own Positive Distractions” item and then delete it with the x button but haven’t unfavorited it first, it deletes from the My Own Positive Distractions list, but not from the My Favorites list because they’re two separate lists. So maybe I should remove the favorites button? (I haven’t decided yet, but it would make it less complicated.) Or maybe there’s something I could add to a formula for the delete button, that it can check if it’s in the favorites page when we go to delete it, it deletes it from there, too?

I love that we got this working! That you helped me get SO much working. Thank you!!!

Could I ask for your help for a few more items? I know you’ve already helped me with SO much.

If you don’t mind helping me more… I want to add some random positive quotes to my Positive Quotes page. I was looking at the instructions here: https://forums.appgyver.com/t/upload-a-csv-file-and-get-a-random-output/2314

I have a .csv file of the quotes. I added a “pick file” in the logic for component tap (though I’d like it to be able to cycle on its own). But how do I pick the csv file so that it is uploaded to the user’s side? Do I create another user database? In case that’s right I created a client-side database RandomPositiveQuotes with the properties Quote, QuoteAuthor, Source, and ID, all of them text. (Though not every quote will have a source.)

But…putting those properties means it would work better with making a page variable and connecting each of them and inputting the random quotes info into the page variable…right? Or at least that’s what I know. So I created a page variable Random Quotes with the properties Quote, QuoteAuthor, Source, and id.

I created a container, added 3 paragraphs of text for the Quote, QuoteAuthor, and Source, then set the container to repeat bound to the page variable RandomQuotes. I linked the first text to “property of data item in repeat” and then to “Quote,” the next the same but to Author, the next the same but to Source.

But doing it that way means that ALL the quotes I inputted show up. Of course, because i set it to repeat.

And then…I’m stuck. I’m hoping you won’t mind helping me…

Great to hear! You can apply the same IF check as in favoriting, when the delete button is pressed first check if the item is also in the Favorites list (the IS_IN_ARRAY_BY_KEY formula). If it is, delete it from there and continue to deleting it from OwnItemList too. It it’s not, you can go directly to deleting it from OwnListItems.

The Pick files flow function means that the user is able to pick a file from their device when using the app. Similar to picking a photo from your photo library. So I think your way with the page variable would work well here. But you only want to display one random quote, right? Then I think the following could work best:

Create an object page variable selected_quote which has the same properties as your page variable of quotes, but with no initial values.
In the logic canvas for your page add a Set page variable for selected_quote after the Page focused event
As for the value of selected_quote, we can randomize the order of your list of quotes and pick the first one: SHUFFLE(pageVars.list_of_quotes)[0]

Now you can bind the paragraph values to the selected_quote properties! This way every time the page is opened, a new random quote should be assigned to selected_quote and be shown in the app.

Thank you so much, Cecilia! (smiling at you).

I haven’t tried the IF formula for the delete button yet.

But I did the part about the selected_quote on my Random Positive Quotes page. And it does give a new quote every time I open the page! (beaming) Thank you!!!

But–something weird happened. When I tapped on the quote, it asked me to give Appgyver access to my files and folders, and then took me there. I don’t know why? And also, is there a way that I can automatically have the quotes cycle, say every 10 seconds?

I also want to allow users to tap on the quote and get a new one, since that seems intuitive. So for the container that the quote and author is in, I added on the component tap the same formula you gave me and it works! (beaming) And now when I tap it it doesn’t ask me for access to files and folders or take me there, so maybe that doesn’t matter now?

Hmm do you maybe have a Pick Files flow function node lying around in some logic canvas? That might explain the permission asking, since the app thinks that the functionality is there in case the node is. If you already deleted it everywhere, then I think this might be a bug on our part :fearful:

And yes cycling is possible! You can do this with the help of a Delay node. Delay pauses the logic flow for the set of time that is defined for it. In the page focused - set page variable flow you can add the delay node and circle back to setting the page variable again:

This way the set page variable gets triggered every X seconds and a new quote should be set for it :slight_smile: However this might get tangled a bit if the user also clicks on the quote and manually changes it, since the delay won’t restart in that case :thinking:

Thank you so much, Cecilia! (smiling at you) I think I had a Pick Files flow function node left from the technique I found and tried to use, and that I deleted it somewhere when I was working on the steps you suggested, so that was my fault, not a bug.

I’m glad cycling is possible! But if it gets tangled with people tapping, then I just choose one technique or the other. Thank you so much!

1 Like

Hi again, Cecilia (smiling at you),
So I tried to do the part about deleting a record from the favorites list before deleting it from the My Own Coping list, and I haven’t got it working. I did something wrong somewhere.

I connected the tapping the x button, in the logic, to the formula IS_IN_ARRAY_BY_KEY(data.FavoriteListItems1, “id”, current.id), and then connected that to deleting from the FavoriteListItem, and then connected that to deleting from the MyOwnCoping, but it didn’t delete it from the FavoriteListItem. And now it’s not deleting it from the My Own Positive Distractions, ether.

Then I tried having both the delete from FavoriteListItem and from MyOwnCoping coming from the IF formula node, but that didn’t work, either. Should I be telling it to delete from FavoriteListItem in the formula? Do I just add delete_key afterward? Sorry I don’t understand or got something wrong.

Also, I made the input 80%, and then added a heart/favorite button and an x to delete, and the heart and x are side by side. Can I put the x below the heart, in the same container? If so, how? Thank you.

Hi! Hmm that should work fine, did you check if the formula editor gives any warnings, any typos or wrong variable names? The flow would be like this:

So if the item is found in the favorites list, then it makes a small detour to delete it there first. And whether the item is found in favorites or not, it still end up deleting the item from the own items list :slight_smile:

Yes you can set the icons above each other, you’ll just have to put the icons inside a container with the layout set as vertical. Like this:

Thank you, thank you, thank you so much, Cecilia! I had three things wrong: I didn’t have one of the connectors on the flow; I so appreciate your showing me a visual. I added it, and it still wasn’t working. SO I checked the formula, as you said, and it wanted a 1 added to FavoriteListItems (which I didn’t put but the program wants?) so I added that to the formula: FavoriteListItems1. Then it still wasn’t working, and I realized that I’d forgotten to connect the id for the logic Delete record from FavoriteListItems to current.id. (slapping forehead). NOW it works! Hurray!!!

And thank you; that is awesome about the container within a container; I didn’t realize I could do that. It’s much easier to use that way since the heart and x buttons are small, to have them over top each other. Thank you!!!

I would have gotten stuck so many times if it wasn’t for your help and your patience; I appreciate it SO much.

I have some more questions, if you don’t mind:
-Is it okay to use empty containers to create white space? I used a few on my random positive quotes page to separate the quote that appears, and the link for people to suggest a quote. Or is there a better way to create space? I searched and couldn’t find an answer but I might have not been using the correct wording.

-How do I allow users to personalize their profile image? I added on the tap logic for the image: pick media files, image, and then I connected that to Data: update record and i think the ID should be bound to the app variable “current user” but there is no image option. Do I need to add an image property to the app variable “current user”? (If so, i can’t figure out how). Or should I create a client-side database Profile and then have the user be able to add their image there?

1 Like

Empty containers are fine to use! Another option is to use the alignment options of components or margins. Whatever feels easiest for you.

As for the imagea, it’s a bit complicated. Basically you’ll need to store the image the user has taken/picked and retrieve it when needed with the help of a storage key that you’ll save somewhere, maybe client side storage would work well here. This power-up explains the process of image storing, I think you can follow that example identically to get it working, just store the storage key to the client side storage and use that to find the images.

Thank you so much, Cecilia! I will work on that later, then, if it’s complicated.

I have something that I know is very simple but I can’t figure it out. In the My Supports where users can input their own supports, I have the name, email, and phone number, each below each other, as paragraphs, and I added a x icon in its own container within that container. I want to bring the x icon up higher, but if I make the container for it all horizontal, then the name, email, and phone number all run together. I tried to put each of them into their own containers but I still couldn’t figure it out… (wincing) Would you mind telling me, even though it’s basic, how to do that? .

Also, how do I allow a user to stay logged in if they haven’t logged out? I have to keep inputting my email and password if I swipe the app closed.

I DID manage to get the user input for the My Supports, and then displaying them, done by myself based on what you’d shown me for the MyOwnCoping, at least–which is something I couldn’t do before you showed me. So thank you!

I found this thread for keeping a user logged in. (But if they log out then they’ll be logged out, right?) https://forums.appgyver.com/t/how-to-stay-signed-in-after-refreshing-my-app/4696/2 I created a user-side database PersistedUser. I added the properties idToken and refreshToken because they’re what i have in the logic for login for firebase authentication. (I hope that that’s right to add those as properties.)

On my login page in the logic I added a create record and bound the resource name to PersistedUser, but when I tried to bind the record properties to what I think it should be, app variable current user it wouldn’t let me, so i must be wrong with that. And because it’s wrong I didn’t go further… I was hoping you might be able to help me with that, too, if you don’t mind?

Another thing I managed to do because of all your help (and Mevi for the color on the tabs) was, on my Release Emotion page, was to add four separate lists with favorite buttons (through page variables) into a conditional renderer so users only went to the area they wanted to see. That is progress!

To get the correct layout for the supports, you can again make use of containers and different layouting options! In this case.I think the following would work, I’ll use your screenshot as an example:

  • Set Container 9 layout to horizontal
  • Add a container within Container 9, set its layout as vertical, and width to maybe 90%
  • Set the paragraphs within that container
  • Add another container within Container 9 and set its width to maybe 10%
  • Set your icon within that container.

That should get the effect you want!

Yes, when logging out then the user should be totally logged out even when refreshing. When pressing logging out, make sure to clear the PersistedUser data variable, just by using Set data variable.

Hmm, how is the binding not working? I would suggest using object with properties again as the binding options, and then field by field bind the correct info to it, like we did with the Create Records previously. Make sure to check that the data types match, so that you’re binding a text type variable to a text type property. For example binding a number type variable to a text type won’t work :slight_smile: If that’s the case, you can try using the formula STRING() to transform a number type to a text type.

Let me know how it goes!