Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
22 Eargesplitten
Oct 10, 2010



Cool, I'll go with that. I've done a little SQL, just to the point of making simple queries, no full on report writing.

What are OO data modeling processes compared to OO programming? Is it like using multiple tables, each for a different object? I apologize for using the word in its own definition.

Adbot
ADBOT LOVES YOU

Lumpy
Apr 26, 2002

La! La! La! Laaaa!



College Slice

22 Eargesplitten posted:

Cool, I'll go with that. I've done a little SQL, just to the point of making simple queries, no full on report writing.

What are OO data modeling processes compared to OO programming? Is it like using multiple tables, each for a different object? I apologize for using the word in its own definition.

With Django's (and many other ORMs) you don't know or care about tables. You create your object models and it wil do whatever it needs to do with however many tables it thinks it needs. This roughly corresponds to a table per model plus a table for each many to many relationship.

Data Graham
Dec 28, 2009

📈📊🍪😋



To put it briefly, Object Relational Mapping frameworks (like Django) create an abstraction layer between your web code and the database, so that you don't have to worry about the nuts and bolts of doing queries, and instead you can think of your tables and rows as objects and instances of those objects. So suppose you have a table like:

code:
Books
id             int
title          varchar(100)
author_id      int (foreign keyed to another table called Authors)
Normally you would have to do raw SQL queries like:

code:
SELECT id,title,author_id FROM Books WHERE id=5
Which of course would be more complex if you wanted to get the related fields from the Authors table by joining it to Books via author_id, and so on. Your code would have to execute the SQL query, then read the resulting rows in a loop, and process the values returned as a data structure or array. Some frameworks make this relatively easy, others less so, but it's all still tied closely to how you build your SQL query, how you pass in (and sanitize) parameters, how you specify which fields you want, how you pull the resulting rows and colums into variables, and so on. It's a lot of procedural boilerplate that takes up a lot of time and space.

An ORM system, instead, lets you do something like this:

code:
books = Book.objects.filter(author_id=5)
book = books[0]
And then you'd have "books", which is an array of instances of an object (Book) which has fields such as id, title, and author_id, which you can call like "book.title" and so on. The SQL query is performed in the background, and it's constructed to "do the right thing" to give you the fields you want, with the joins you want. To make changes, you just set the properties ("book.title = 'My Tank Is Fight'"), and then call a "save()" method ("book.save()"). The framework makes the update query for you.

Different ORMs work in different ways, but the usual pattern is that a "model" is defined in your code for each table, and that model is a class/object in the language's natural structure. Your code interacts with the model, and it's the framework's job to keep the model in sync with the back-end database. It handles all the connection-level poo poo, the column types, the validation, and so on, as is appropriate for whatever your DB of choice is. This is how Django can swap from a MySQL back-end to a PostgreSQL back-end with minimal fuss; it's all kept pretty much hidden away from the code you have to worry about.

Where it really gets cool is that your models are directly related to each other by their foreign key relationships, so there'll be a model for Book and another for Author (both corresponding to tables in the DB), and a Book instance has an Author instance linked to it as a property. So you can go "book.author.name" to get the author's name, because Django joined the tables together behind the scenes and you never had to even think about it. It's pretty rad.

Data Graham fucked around with this message at 03:29 on Aug 21, 2016

Slimy Hog
Apr 22, 2008

Data Graham posted:

To put it briefly, Object Relational Mapping frameworks (like Django) create an abstraction layer between your web code and the database, so that you don't have to worry about the nuts and bolts of doing queries, and instead you can think of your tables and rows as objects and instances of those objects. So suppose you have a table like:

code:
Books
id             int
title          varchar(100)
author_id      int (foreign keyed to another table called Authors)
Normally you would have to do raw SQL queries like:

code:
SELECT id,title,author_id FROM Books WHERE id=5
Which of course would be more complex if you wanted to get the related fields from the Authors table by joining it to Books via author_id, and so on. Your code would have to execute the SQL query, then read the resulting rows in a loop, and process the values returned as a data structure or array. Some frameworks make this relatively easy, others less so, but it's all still tied closely to how you build your SQL query, how you pass in (and sanitize) parameters, how you specify which fields you want, how you pull the resulting rows and colums into variables, and so on. It's a lot of procedural boilerplate that takes up a lot of time and space.

An ORM system, instead, lets you do something like this:

code:
books = Book.objects.filter(author_id=5)
book = books[0]
And then you'd have "books", which is an array of instances of an object (Book) which has fields such as id, title, and author_id, which you can call like "book.title" and so on. The SQL query is performed in the background, and it's constructed to "do the right thing" to give you the fields you want, with the joins you want. To make changes, you just set the properties ("book.title = 'My Tank Is Fight'"), and then call a "save()" method ("book.save()"). The framework makes the update query for you.

Different ORMs work in different ways, but the usual pattern is that a "model" is defined in your code for each table, and that model is a class/object in the language's natural structure. Your code interacts with the model, and it's the framework's job to keep the model in sync with the back-end database. It handles all the connection-level poo poo, the column types, the validation, and so on, as is appropriate for whatever your DB of choice is. This is how Django can swap from a MySQL back-end to a PostgreSQL back-end with minimal fuss; it's all kept pretty much hidden away from the code you have to worry about.

Where it really gets cool is that your models are directly related to each other by their foreign key relationships, so there'll be a model for Book and another for Author (both corresponding to tables in the DB), and a Book instance has an Author instance linked to it as a property. So you can go "book.author.name" to get the author's name, because Django joined the tables together behind the scenes and you never had to even think about it. It's pretty rad.

Learning webdev right now and this is like loving magic.

Gmaz
Apr 3, 2011

New DLC for Aoe2 is out: Dynasties of India

Maluco Marinero posted:

Python + Django is a pretty good framework to get started with. The documentation is world class compared to most of the competition, including Ruby on Rails.
I haven't used Django in around 3 years but I don't recall the documentation being superior to RoR, and I found the Hartl tutorial for Rails superior to whatever Django had offered at the time.

IMO if this is your first foray into web development don't start with big frameworks like Django/Rails, try something more simple on the level of Flask(Python), Sinatra(Ruby). Try to implement the boilerplate that bigger frameworks and their libraries do for you so you at least know what's going on, then it will be much easier and less confusing to jump into a bigger framework. If you go with a bigger framework chances are you'll be able to use them after finishing the tutorials, but won't really know what is going on the lower level as much, or why the need for such frameworks even arose. I would even go up to the point of not using an ORM for babby's first webapp.

return0
Apr 11, 2007

Slimy Hog posted:

Learning webdev right now and this is like loving magic.

YMMV, but ORMs are insanely bad if you want to do non-trivial queries with results spanning multiple tables with complex conditions.

Data Graham
Dec 28, 2009

📈📊🍪😋



That's the downside. And not just with weird slow queries, sometimes just with pure volume and poorly procedurally generated views. If you're, say, building an API and you want to return objects with various relevant related fields, Django/DRF will happily spit them out for you, sometimes with all 50 million related objects for every thing you want. You have to be smart and optimize.

PT6A
Jan 5, 2006

Public school teachers are callous dictators who won't lift a finger to stop children from peeing in my plane
90% of the time you don't need to do those kinds of queries, though. You should still learn SQL, but having an ORM to take care of the simple stuff is very nice.

Django is good, you should learn it.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

return0 posted:

YMMV, but ORMs are insanely bad if you want to do non-trivial queries with results spanning multiple tables with complex conditions.

Don't let this put you off from using Django. You probably won't need to do these types of queries very often, and when you do Django gives you easy ways to use SQL.

lunar detritus
May 6, 2009


Thermopyle posted:

Don't let this put you off from using Django. You probably won't need to do these types of queries very often, and when you do Django gives you easy ways to use SQL.

Seconding this. Worrying about the speed of your queries or that "ORMS ARE SLOW :byodood:" is definitely in "premature optimization" territory, especially when you're starting out.

return0
Apr 11, 2007

Thermopyle posted:

Don't let this put you off from using Django. You probably won't need to do these types of queries very often, and when you do Django gives you easy ways to use SQL.

Oh, I agree. For maybe 70% of my queries I use the ORM (which for me tends to be ActiveRecord on Rails or Sinatra, but it's the same deal as django or SQLAlchemy or whatever).

I was stating because in the past I have made the mistake of shoehorning a query that was much more appropriate to just drop to SQL for onto the ORM, with fugly consequences. I've also seen people make broken models with tons of redundancy to support the ORM rather than denormalising and using SQL.

My problem isn't that it's necessarily slow (although it can be), it's that it's hard to express non-trivial queries (of which there are typically not many). Definitely try with the ORM first, but be brave about dropping to SQL if it feels like it would be cleaner.

Thermopyle
Jul 1, 2003

...the stupid are cocksure while the intelligent are full of doubt. —Bertrand Russell

I'm pretty sure it's quoted in Two Scoops of Django, but somewhere Jacob Kaplan-Moss (a core dev on Django) says something about SQL should be considered a first-class citizen of Django. In other words, using SQL shouldn't feel like you've failed with using the ORM or that you're entering some ghetto...it's just as important and useful as the ORM.

Of course, it's kind of hard to come to that impression just from reading the docs, but I think that's mostly because SQL is a different subject from Django and Django doesn't really bring anything new to the whole use-SQL-to-query-your-data game.

fuf
Sep 12, 2004

haha
Anyone played around with the new Google Sites much yet?
https://www.youtube.com/watch?v=S1WZtm6aNWM

I host some email accounts for people on google apps, and it would be nice to offer some kind of very cheap, self-contained "email and very basic static website" package all within a single google apps account. Feasible?

Also, how do you think sites built in google sites rank in google search results? I mean I'm sure they don't just bump their own sites to the top, but since the ranking algorithm looks at things like server response time, it's gotta be a benefit if your site is hosted by google, right?

poxin
Nov 16, 2003

Why yes... I am full of stars!
After reading the last page of this I decided to give Django a shot too. Going through the Django tutorial app now and after seeing the admin site, wow, blown away by that. I've had a brief understanding of PHP from when I was younger and decided to pick up Laravel in the last months. Really considering making a switch over to this because basically it's not PHP.

Maluco Marinero
Jan 18, 2001

Damn that's a
fine elephant.
The in built admin site is a really nice party trick up Django's sleeve. Has come in handy for nearly every project I've done for some sort of custom workflow. We do bespoke middle tier stuff, budgets of around $10k - $50k AUD. Django is a real handy tool for hitting those deadlines cleanly while still nearing all their goals. That said we have some custom stuff for templating that lets us do everything in React.js.

The Fool
Oct 16, 2003


Maluco Marinero posted:

The in built admin site is a really nice party trick up Django's sleeve. Has come in handy for nearly every project I've done for some sort of custom workflow. We do bespoke middle tier stuff, budgets of around $10k - $50k AUD. Django is a real handy tool for hitting those deadlines cleanly while still nearing all their goals. That said we have some custom stuff for templating that lets us do everything in React.js.

This may be a naive question, but how do you handle routing when doing django + react? In my, admittedly limited, experience react prefers to run as an SPA, while django... Is not that

Maluco Marinero
Jan 18, 2001

Damn that's a
fine elephant.

The Fool posted:

This may be a naive question, but how do you handle routing when doing django + react? In my, admittedly limited, experience react prefers to run as an SPA, while django... Is not that

Oh not a naive question at all. What we do is run a node server we call the 'view-layer' bound to 127.0.0.1 alongside the Django server. That view layer has routes mapped to full page React components that accept a JSON payload. Django handles routing, collects the necessary objects from the database, serialises the lot and then sends it off to view layer which returns a HTML document that Django can then do its thing with.

In practice that means our views, instead of ending with a Django template render, end with a call to a view layer function that does all that and returns the response.

Why go to the effort? Our front end process includes a component server (undocumented but https://www.npmjs.com/package/react-component-library ) that has us linking JSON test data and React components automatically as part of the workflow. This means my partner and I can setup data model first and code front end and back end once, with zero integration costs (converting work to the Django template layer). It's really slick and has been a godsend for maintaining deadlines.

PT6A
Jan 5, 2006

Public school teachers are callous dictators who won't lift a finger to stop children from peeing in my plane

Maluco Marinero posted:

The in built admin site is a really nice party trick up Django's sleeve. Has come in handy for nearly every project I've done for some sort of custom workflow. We do bespoke middle tier stuff, budgets of around $10k - $50k AUD. Django is a real handy tool for hitting those deadlines cleanly while still nearing all their goals. That said we have some custom stuff for templating that lets us do everything in React.js.

The built-in admin site (and built-in user handling) is excellent, and a big part of the reason I stick with Django for most anything I can.

Knifegrab
Jul 30, 2014

Gadzooks! I'm terrified of this little child who is going to stab me with a knife. I must wrest the knife away from his control and therefore gain the upperhand.
I'm using react. I am trying to set an indeterminate state to a checkbox using refs. I am also trying to use data attributes to pass information about the box. However I cannot seem to be able to access those data attributes inside my ref callback. I can access other things like tite, id but not data attributes, what gives?

Basically:
code:
<input 
  type="checkbox"
  data-id="red"
  ref={(checkbox) => { this.setIndeterminate(checkbox)}}
/>

...

function setIndeterminate(checkbox) {

    let id = checkbox['data-id'];  //this returns undefined

   ...//do logic to deterimine indeterminate now that I know what the checkbox is

}
I just don't understand why I can't access data attributes.

Maluco Marinero
Jan 18, 2001

Damn that's a
fine elephant.
checkbox is a DOM element, and DOM elements don't work that way. If you want an attribute of a DOM element you use:

code:
let id = checkbox.getAttribute('data-id');

Depressing Box
Jun 27, 2010

Half-price sideshow.
Alternatively, if you just need the data you're assigning to the element you can use currying to pass it directly:

JavaScript code:
<input 
  type="checkbox"
  ref={this.setIndeterminate('red')}
/>

...

setIndeterminate = (id) => (checkbox) => {
  // logic, with both the id and the checkbox element available
}
You can also do it with bind() if you don't like class properties/currying/etc.:

JavaScript code:
<input 
  type="checkbox"
  ref={this.setIndeterminate.bind(this, 'red')}
/>

...

setIndeterminate(id, checkbox) {
  // logic, with both the id and the checkbox element available
}

Knifegrab
Jul 30, 2014

Gadzooks! I'm terrified of this little child who is going to stab me with a knife. I must wrest the knife away from his control and therefore gain the upperhand.
Thanks for the help guys, I got it working! I have no idea what currying is though :P

Depressing Box
Jun 27, 2010

Half-price sideshow.
Currying is just writing a function with multiple arguments as a series of nested single-argument functions. It lets you start calling a function before you know all the arguments (known as partial application, and very useful for things like event handlers).

For example, let's say you have a function like this:

JavaScript code:
function speak(name, words) {
  return name + ' says, "' + words + '"';
}
But if you're in a situation where you know the user's name but not what they're going to say (maybe they fill out a prompt) you're out of luck. If you write it like this, though:

JavaScript code:
function speak(name) {
  return function(words) {
    return name + ' says, "' + words + '"';
  }
}

// Or with arrow functions, which look cleaner...
const speak = (name) => (words) => {
  return name + ' says, "' + words + '"';
}
You can do something like this:

JavaScript code:
const johnSpeaks = speak('John'); // returns a function

// Later, when you have their input...

johnSpeaks('Hello!') // returns "John says, "Hello!""

Depressing Box fucked around with this message at 20:35 on Aug 24, 2016

Knifegrab
Jul 30, 2014

Gadzooks! I'm terrified of this little child who is going to stab me with a knife. I must wrest the knife away from his control and therefore gain the upperhand.
Oh I see... interesting! Thanks for the clarification I'm sure that'll help me out some day!

kedo
Nov 27, 2007

Can any one recommend a reliable, fast VPN service that offers multiple gateways in different countries? I'm mainly looking for something that will A) give me a bit of protection when I'm working on unsecured wireless networks, and B) will allow me to test sites while masquerading as a user with a German or [insert other country besides the US here] IP. Happy to pay.

I had a service I liked previously, but their quality and speeds went to poo poo.

camoseven
Dec 30, 2005

RODOLPHONE RINGIN'

kedo posted:

Can any one recommend a reliable, fast VPN service that offers multiple gateways in different countries? I'm mainly looking for something that will A) give me a bit of protection when I'm working on unsecured wireless networks, and B) will allow me to test sites while masquerading as a user with a German or [insert other country besides the US here] IP. Happy to pay.

I had a service I liked previously, but their quality and speeds went to poo poo.

Private Internet Access has been really good for me.

kedo
Nov 27, 2007

camoseven posted:

Private Internet Access has been really good for me.

Thanks. I used them a few years ago actually, I may have to check them out again.

Sort of off-topic, but can anyone recommend a good PDF typesetting company? I have a client that wants to archive ~6000 pages from an old site. We have zero ability to automate the process. I just had a call with Innodata (who I know does that sort of work), but it was apparently too small of a project for them. Some cursory googling has led me to believe there are surprisingly few companies that provide this sort of service.

Lumpy
Apr 26, 2002

La! La! La! Laaaa!



College Slice

kedo posted:

Thanks. I used them a few years ago actually, I may have to check them out again.

Sort of off-topic, but can anyone recommend a good PDF typesetting company? I have a client that wants to archive ~6000 pages from an old site. We have zero ability to automate the process. I just had a call with Innodata (who I know does that sort of work), but it was apparently too small of a project for them. Some cursory googling has led me to believe there are surprisingly few companies that provide this sort of service.

Have you looked into Weasy Print? http://weasyprint.org/ It's pretty good and easy to set up and run.

Omits-Bagels
Feb 13, 2001
I have an UX/UI question...

I'm in the very beginning stages of redesigning my website (http://thesavvybackpacker.com) but I don't know the best way to approach user flow and managing my content.

My site has advice about traveling in Europe. I like to think of my site more as a guide book than a blog. I have the main categories (which I view as chapters) on the left as a vertical menu and when you click on that I have specific articles about different topics.

I thought this was a fairly straightforward and logical layout but my bounce rates are still pretty high and my time on site and pages visited isn't as high as I'd like.

Is there a better way to organize all my information or is there something I can do to help improve user experience? I want to nail this down before I start my redesign.


Home page:


Category Page:


Thanks in advance.

Lumpy
Apr 26, 2002

La! La! La! Laaaa!



College Slice

Omits-Bagels posted:

I have an UX/UI question...

I'm in the very beginning stages of redesigning my website (http://thesavvybackpacker.com) but I don't know the best way to approach user flow and managing my content.

My site has advice about traveling in Europe. I like to think of my site more as a guide book than a blog. I have the main categories (which I view as chapters) on the left as a vertical menu and when you click on that I have specific articles about different topics.

I thought this was a fairly straightforward and logical layout but my bounce rates are still pretty high and my time on site and pages visited isn't as high as I'd like.

Is there a better way to organize all my information or is there something I can do to help improve user experience? I want to nail this down before I start my redesign.


Home page:


Category Page:


Thanks in advance.

A couple quick wins:

1. Change "Tips for backpacking..." to "A Guide for backpacking..."

2. Change "Recent Blog Posts" to "Latest Guides"

Gets people more in the mindset that it's a guide site right off the bat. On the phone, so I don't have much more right now. =0

The Dave
Sep 9, 2003

I would look into reduce the number of categories you have, or grouping categories so I can mentally get through your sidebar quicker. Then once I get to your category page, I wonder if a subnav up top is viable/helpful. Also just glancing your screen, I see "Backpacking packing list for europe, packing list for women, packing list for any style" seems like language can be better to be more digestible.

kedo
Nov 27, 2007

Lumpy posted:

Have you looked into Weasy Print? http://weasyprint.org/ It's pretty good and easy to set up and run.

Much appreciated, that looks like a handy tool. I'll keep it in my back pocket in case we can't find a typesetter, but I'd really prefer to hand this project off to someone else as it sounds like a tedious, boring task. Still, thanks!

e:


I'd think about doing something else with that big banner at the top of the page. It's a cool treatment, but it serves zero purpose other than repeating what your logo already says in slightly different words. It could do some work for you if you wanted, but right now you're filling the most visible, eye-catching real estate on your homepage with non-functional window dressing.

You could do a lot more with your category pages too. The plain text lists of posts are kind of boring and I don't want to take the time to read them.

kedo fucked around with this message at 19:47 on Aug 27, 2016

Omits-Bagels
Feb 13, 2001

kedo posted:

Much appreciated, that looks like a handy tool. I'll keep it in my back pocket in case we can't find a typesetter, but I'd really prefer to hand this project off to someone else as it sounds like a tedious, boring task. Still, thanks!

e:


I'd think about doing something else with that big banner at the top of the page. It's a cool treatment, but it serves zero purpose other than repeating what your logo already says in slightly different words. It could do some work for you if you wanted, but right now you're filling the most visible, eye-catching real estate on your homepage with non-functional window dressing.

You could do a lot more with your category pages too. The plain text lists of posts are kind of boring and I don't want to take the time to read them.

I agree 100%. It seemed like a cool idea at the time but now I'm realizing that it's more show than function (as you said). I'm just not sure what to actually do with the space/the home page.

Would thumbnails make the category pages more inviting? I'm trying to think what else could make people want to explore more.

kedo
Nov 27, 2007

Omits-Bagels posted:

I agree 100%. It seemed like a cool idea at the time but now I'm realizing that it's more show than function (as you said). I'm just not sure what to actually do with the space/the home page.

Seems like a good spot to promote whatever is most important to you at any given time, or maybe a set of rotating articles that you feel would resonate with users and draw them deeper into the site. If you could, keep the video treatment (maybe a single scene on a loop instead of multiple scenes) and have it thematically match the content. That'd be coolio.

Omits-Bagels posted:

Would thumbnails make the category pages more inviting? I'm trying to think what else could make people want to explore more.

A list is a list whether or not it has thumbnails or not. If the list doesn't contain what I'm looking for, adding thumbnails to it isn't going turn it into what I'm looking for.

What are your user's goals when they visit your site? I'd assume they don't include "exploring someone's website." Without knowing what those goals are, it's hard to know how to improve the UX. You can figure out these goals by examining your analytics, or better yet asking your users. Once you know them, you can make informed decisions about how to better structure a page. What I'm describing here is the simplest form a UX process can take: define the problem, define user goals (by reviewing analytics, conducting surveys, performing persona/user story exercises, etc.), define your goals, test different UX solutions that you think achieve both. So my answer is do some research before you start changing things.

e: For example, try to answer this question with three different <type of user> and a few variations for each type. This is a user story exercise and it can help you start thinking about your site from a goal-oriented perspective. These can be as functionally vague or specific as you'd like.

As a <type of user>, I want <some goal> so that <some reason>.

Functionally vague examples:
"As a person considering trip in the semi-distant future, I want to view recommended destinations so that I can choose where to go on my trip."
"As a college student with no money, I want to find cheap but tasty restaurants so that I can enjoy a country's cuisine without going broke."

Functionally specific example:
"As a person choosing a destination for a trip, I want to be able to sort and filter a list of destinations so that I can easily compare different destinations to each other."

kedo fucked around with this message at 22:34 on Aug 27, 2016

The Merkinman
Apr 22, 2007

I sell only quality merkins. What is a merkin you ask? Why, it's a wig for your genitals!

kedo posted:

... maybe a set of rotating articles that you feel would resonate with users and draw them deeper into the site.
Are you suggesting a carousel?

kedo
Nov 27, 2007

The Merkinman posted:

Are you suggesting a carousel?

Haha, no. :) I was thinking of choosing a random, popular article on page load. I suppose I should have been more specific.

Although carousels are great..............................

ModeSix
Mar 14, 2009

e: nevermind

ModeSix fucked around with this message at 16:50 on Aug 28, 2016

Maed
Aug 23, 2006


For the love of god don't make a Carousel unless you follow all these rules:

https://www.google.com/url?sa=t&sou...1c49X4g69gG7hmw

ddiddles
Oct 21, 2008

Roses are red, violets are blue, I'm a schizophrenic and so am I
I would replace the top video banner with links to the three main sections someone who's traveling would be interested in (where to go, how to get around once you're there, how much to budget for a trip)

Adbot
ADBOT LOVES YOU

Maleh-Vor
Oct 26, 2003

Artificial difficulty.
I'm going to echo that you should definitely reduce the amount of categories you have or group them someway. That left menu is way too busy with far too much text, and no one is going to want to read that. Find a way to group up or remove some categories, then give each a little more breathing room. They're pretty tightly packed right now.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply